当SOCKET接收到数据时在SOCKET线程中能向当前对话框发送SendMessage消息,(已在对话框中映射了消息)
但Domodal()建立一个新对话框后确收不到消息.
直到退出建立的新对话框时消息才被上一个对话框收到.
请各位高手帮忙,是何问题如何解决?
SOCKET线程代码如下:
#include "stdafx.h"
#include "resource.h"
#include "TCPClient.h"
#include "Room.h"
#include "DBComm.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endifHWND Cpub::ActivehWnd;
CString Cpub::RecvData;CTCPClient_CE::CTCPClient_CE()
{
   WSADATA wsd;
   WSAStartup(MAKEWORD(1,1),&wsd);
   m_exitThreadEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
}CTCPClient_CE::~CTCPClient_CE()
{
   WSACleanup();
   CloseHandle(m_exitThreadEvent);
}bool CTCPClient_CE::Open(CWnd * pWnd)
{
   ResetEvent(m_exitThreadEvent);
   m_pOwnerWnd = pWnd;
   m_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
   if (m_socket == SOCKET_ERROR)
   {
   return FALSE;
   }   m_tcpThreadHandle = CreateThread(NULL,0,SocketThreadFunc,this,0,NULL);
   if (m_tcpThreadHandle == NULL)
   {
   closesocket(m_socket);
   return FALSE;
   }
   return TRUE;
}
DWORD CTCPClient_CE::SocketThreadFunc(LPVOID lparam)
{
CTCPClient_CE *pSocket;
pSocket = (CTCPClient_CE*)lparam;
fd_set fdRead;
int ret;
TIMEVAL aTime;
aTime.tv_sec = 1;
aTime.tv_usec = 0;
while (TRUE)
{
if (WaitForSingleObject(pSocket->m_exitThreadEvent,0) == WAIT_OBJECT_0)
{
break;
}
FD_ZERO(&fdRead);
FD_SET(pSocket->m_socket,&fdRead);
ret = select(0,&fdRead,NULL,NULL,&aTime);
if (ret == SOCKET_ERROR)
{
pSocket->OnError(pSocket->m_pOwnerWnd,1);
pSocket->OnDisConnect(pSocket->m_pOwnerWnd);
closesocket(pSocket->m_socket);
break;
} if (ret > 0)
{
if (FD_ISSET(pSocket->m_socket,&fdRead))
{
char recvBuf[8000];
int recvLen={0};
ZeroMemory(recvBuf,8000);
recvLen = recv(pSocket->m_socket,recvBuf, 8000,0); 
if (recvLen == SOCKET_ERROR)
{
int iError = WSAGetLastError();
pSocket->OnError(pSocket->m_pOwnerWnd,iError);
pSocket->OnDisConnect(pSocket->m_pOwnerWnd);
closesocket(pSocket->m_socket);
break;
}
else if (recvLen == 0)
{
pSocket->OnDisConnect(pSocket->m_pOwnerWnd);
closesocket(pSocket->m_socket);
break;
}
else
{
                   pSocket->OnSockRead(pSocket->m_pOwnerWnd,recvBuf,recvLen);
}
}
}
}
return 0;
}
bool CTCPClient_CE::Close()
{   SetEvent(m_exitThreadEvent);
   Sleep(1000);
   int err = closesocket(m_socket);
   if (err == SOCKET_ERROR)
   {
   return FALSE;
   }
   return TRUE;
}bool CTCPClient_CE::Connect()
{
   struct sockaddr_in addr;
   int err;   addr.sin_family = AF_INET;
   addr.sin_port = htons(m_port);
   char ansiRemoteHost[255]={0};
ZeroMemory(ansiRemoteHost,255);
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,m_remoteHost,wcslen(m_remoteHost)
,ansiRemoteHost,wcslen(m_remoteHost),NULL,NULL);   addr.sin_addr.s_addr=inet_addr(ansiRemoteHost);
   err = connect(m_socket,(struct sockaddr *)&addr,sizeof(addr));
   if (err == SOCKET_ERROR) 
   {
     AfxMessageBox(_T("Connected failed!"));
     return FALSE;
   }
   DWORD ul= 1;
   ioctlsocket(m_socket,FIONBIO,&ul);
   return TRUE;
}bool CTCPClient_CE::SendData(WCHAR * wbuf)
{
char * buf;
int wlen=wcslen(wbuf)*2+1;
buf=new char[wlen];
ZeroMemory(buf,wlen);
wcstombs(buf,wbuf,wlen); int nBytes = 0;
int nSendBytes=0;

while (nSendBytes < wlen)
{
    nBytes = send(m_socket,buf+nSendBytes,wlen-nSendBytes,0);
if (nBytes==SOCKET_ERROR )
{
int iErrorCode = WSAGetLastError();
OnError(m_pOwnerWnd,iErrorCode);
OnDisConnect(m_pOwnerWnd);
Close();
return FALSE;
}
nSendBytes = nSendBytes + nBytes;
if (nSendBytes < wlen)
{
    Sleep(2000);
}

return TRUE; 
}void CTCPClient_CE::OnSockRead(CWnd* pWnd,const char * buf,int len )
{
char * MsgID=new char[4];
for (int i=0;i<4;i++)
MsgID[i]=buf[i];
int UserMsg=atoi((char*)MsgID);
delete []MsgID; Cpub::RecvData=buf; switch (UserMsg)
{
case WM_LOGINTRUE:
{

if (Cpub::ActivehWnd!=0)
SendMessage(Cpub::ActivehWnd,WM_LOGINTRUE,0,0);
break;
}
case WM_LOGINFAILED:
{
if (Cpub::ActivehWnd!=0)
SendMessage(Cpub::ActivehWnd,WM_LOGINFAILED,0,0);
break;
}
case WM_REROOMTYPE:
{
if (Cpub::ActivehWnd != 0)
SendMessage(Cpub::ActivehWnd,WM_REROOMTYPE,0,0);
//Cpub::ActivehWnd是当前对话框句柄
break;
}
default:
break;
}
}

解决方案 »

  1.   

    1.
    Cpub::ActivehWnd是否是有效的窗口
    2.
    是否对WM_REROOMTYPE进行了消息映射,原型是否正确
    3.
    SendMessage=>PostMessage
      

  2.   

    Cpub::ActivehWnd是有效窗口,WM_REROOMTYPE也进行了映射,现在的情况是本来应该在当前窗口接收数据再发送消息的,但线程不知道什么原因好象是在上一级窗口那阻塞了
      

  3.   

    to: jacklzw88(不可爱咯) 
    有多个消息是分别映射到多个对话框的.
    目前的问题是SOCKET要退出Domodal()出来的对话框,才能在线程函数中收到数据
      

  4.   

    多线程之间最后用postmessage不用sendmessage
      

  5.   

    是线程没能转到新对话框上,Domodal后线程函数就被阻在对话框外边了
      

  6.   

    不要用Domodal() 用create()就可以了