UI 线程 创建了 一个Socket线程。需求是:
socket线程接收到某个消息后,自动退出程序。请问 如何实现?直接调用PostMessage(...WM_CLOSE...) 好像没作用。另外,作为UI创建出来的Socket线程,它可以去关闭UI线程么?

解决方案 »

  1.   

    直接调用PostMessage(...WM_CLOSE...) 好像没作用。另外,作为UI创建出来的Socket线程,它可以去关闭UI线程么?
    ==========
    你PostMessage是怎么写的呢?窗口句柄对不对呢?子线程去关闭UI线程当然是可以的。其实发WM_CLOSE就行。
      

  2.   

    接收线程里PostMessage(...WM_CLOSE...)?
    阻塞掉了,
      

  3.   

    思路有问题。
    再整理一下。
    是这样的。
    MFC工程,我在Dlg(其实也是一个线程 对吧)里,创建了一个后台线程,用于处理socket消息。
    现在,我想在Dlg结束之前,比如触发了OnCancel的时候,先判断一下 socket线程还健在否。
    如果健在,那就一直等待。就是想实现这个功能的。
      

  4.   

    在Dlg中用WaitForSingleObject(线程句柄,INFINITE);等待,如果线程还在,这个语句会阻塞住,如果不在了,这个语句会返回,不过有个缺陷,界面也会被阻塞住的。
      

  5.   

    回4楼、5楼:
    我使用WaitForSingleObject(Infinite),完全没反应。也就是说,程序就阻塞在那里了。
    可能的原因是,socket线程调用了sendMessage()和UI线程进行了交互,这导致了程序挂在那里没反应。当我把sendmessage换成了postmessage(), 虽然可以解决WaitForSingleObject的问题,但是PostMessage会出现UI线程无法全部解析数据的问题。如果自己设计消息队列,又涉及到不停的开启关闭关键区域线程保护的问题,影响效率。请问 是否有相关经验?多谢。
      

  6.   

    退出程序? exit(0); 无论哪个线程都行. 
      

  7.   

    你的问题如果用WaitForSingleObject虽然能达到目的,但是界面会阻塞,这个是WaitForSingleObject决定的,没办法。
    是不是换个想法,由socket线程在结束时通知主线程。你可以设一个标志位,如果socket线程的结束消息来时,将这个标志位设为TRUE,在Dlg结束前查询一下这个标志位即可。
      

  8.   

    楼主做一个全局标志,
    Socket线程启动时把它搞成TRUE,socket线程结束时把它搞成FALSE,不就行了吗?
      

  9.   

    你到底是要无限等待 知道后台线程完成 还是直接跳出Oncancel 语句
      

  10.   

    void CXXDialog::OnCancel()
    {
    GetExitThreadCode(handle, &dwExitCode);
    if(STILL_ACTIVE  == dwExitCode)
    {
     // ...线程还在运行
    }
    else
      CDialog::OnCancel();
    }