在线程中 显示一个对话框运行错误,在自定义消息中,同样语句没有运行错误。请问是怎么回事以下为一个基于UDP的接受消息的线程,CMSGDialog 为一定制好的对话框关联的类
本打算在收到消息后用DoModal()显示该对话框。语句为//   CMSGDialog dlg;
                                     //    dlg.DoModal();
已被注释掉。编译通过运行时出错。
现通过自定义消息的响应函数中用同样的语句,能正确显示。
请问是怎么回事?代码如下:(通过自定义消息能正确显示的代码。自定义消息,消息影射,消息函数申明已省去)//接收消息线程
DWORD WINAPI recvMSG(LPVOID lpParameter)
{
WSADATA wsasata;
WSAStartup(0x0202,&wsasata); SOCKET socketSrv;
socketSrv=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSrv,addrClient;
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(PORTMSG);
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
bind(socketSrv,(sockaddr *)&addrSrv,sizeof(SOCKADDR_IN));
int Len=sizeof(addrClient);
char BufRecv[100];
while(1)
{
recvfrom(socketSrv,BufRecv,100,0,(sockaddr *)&addrClient,&Len);
   //   CMSGDialog dlg;
   // dlg.DoModal();
HWND hWnd;
hWnd=(HWND)lpParameter;
::PostMessage(hWnd,WM_RECVMSG,0,(LPARAM)BufRecv);
}
return 0;
}
//自定义消息响应函数
void CXiangMUDlg::OnRecvMSG(WPARAM wParam,LPARAM lParam)
{
CMSGDialog dlg;
dlg.DoModal();
}

解决方案 »

  1.   

    MFC的界面是线程相关的,不要在工作线程中做界面相关的操作,要通过发送消息给界面线程,然后在界面线程中做相应的处理。
      

  2.   

    //可以调用的,不过要这样实现:
    //ONBUTTON事件
    pThreadSendFlag=::AfxBeginThread(_SendFlagThread,this);//传递this指针//工作者线程
    UINT _SendFlagThread(LPVOID lparam)
    {
    CBackupClientDlg *pDlg=(CBackupClientDlg *)lparam;//CBackupClientDlg为你的对话框类
    ...
    }
      

  3.   

    可是我在线程里边直接调用Domodl()这样也算在消息处理里边吗?