我在主程序(主UI)中点击菜单会弹出模态对话框,程序除了主UI线程外,还开了一个网络UDP数据循环接收线程(非UI线程),我现在的需求就是当网络中的嵌入式设备控制台向我发送请求获得设备的控制权时,无论我的主UI界面现在在做什么,都要弹出 嵌入式设备控制台端 请求控制权的消息通知对话框(由此在网络UDP数据循环接收线程中收到该请求消息时创建辅助UI线程,并在该线程中创建非模态对话框),以通知主机用户是否给予其控制权限,用户此时看到该请求对话框后 可以点击同意或不同意返回消息并退出消息通知对话框,也可以不关闭该消息通知对话框,继续自己主UI界面的控制工作,直到主机用户完成主UI界面的工作后,再点击同意或不同意,当然当用户不回复时,嵌入式设备控制台还可以继续请求,但是此时对话框始终只显示一个,只是对话框中的报警图片切换几次闪闪而已,问题是如果我在主UI窗口关闭时无论此时是否退出了辅助UI线程创建的非模态对话框,运行到PostThreadMessage(辅助UI线程*->id,WM_QUIT,0,0);让辅助UI线程退出时都会报运行时异常。

解决方案 »

  1.   

    基本上看明白了,控制过程有点复杂。如果是我来设计,我会在主线程中向消息通知对话框POST一个WM_CLOSE消息并等待线程结束。
      

  2.   

    在辅助UI线程中定义一个线程退出事件,当要该UI线程退出时,置该事件为有信号状态,UI线程中检测到该事件为有信号状态时,即让线程正常退出
      

  3.   

    先关闭掉所有子UI线程的窗口,这样才能让子UI线程正常结束掉。使用EnumChildWindows枚举当前程序中的对话框。BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
    {
    TCHAR szClassName[1024];
    ::GetClassName(hwnd,szClassName,1024);
    DWORD dwProcessID;
    GetWindowThreadProcessId(hwnd,&dwProcessID);
    if(!_tcscmp(szClassName,_T("#32770")) //当前窗体是对话框
     && dwProcessID==GetCurrentProcessId() && hwnd!=(HWND)lParam) //当前窗体是当前程序的,且不是主窗体
    {
    PostMessage(hwnd,WM_CLOSE,0,0);
    }
    return TRUE;
    }// 主窗体关闭时接受消毁消息
    void CTSUServerDlg::OnDestroy()
    { EnumChildWindows(GetDesktopWindow()->GetSafeHwnd(),EnumChildProc,(LPARAM)GetSafeHwnd()); 
    WaitForMultiplyObjects(5,hThreadList,TRUE, INFINITE); //等待所有子线程(包含UI线程)结束
    }//当用户点击要关闭主窗体时
    void CTSUServerDlg::OnExit()
    {
    CDialog::OnCancel();
    PostQuitMessage(0);
    }