是否可以在窗口进程的WSAAsyncSelect
消息中调用WM_CREATE
(WinProc
),然后在同一recv
内执行所有WinProc
个操作({例如recv
并用WM_SOCKET
下的接收字节数据填充控件?
例如,我知道在WinProc
内执行长任务会导致窗口无响应(因为在完成此消息之前它无法处理其他消息),但是我没有看到任何处理此消息的示例具有线程或事件对象的recv
I / O.完全没必要吗?
以下是我在网上看到的WinProc
中的示例案例,以及在Petzold中recv
以类似的方式处理:
case WM_SOCKET:
{
if(WSAGETSELECTERROR(lParam))
{
MessageBox(hWnd,
"Connection to server failed",
"Error",
MB_OK|MB_ICONERROR);
SendMessage(hWnd,WM_DESTROY,NULL,NULL);
break;
}
switch(WSAGETSELECTEVENT(lParam))
{
case FD_READ:
{
char szIncoming[1024];
ZeroMemory(szIncoming,sizeof(szIncoming));
int inDataLength=recv(Socket,
(char*)szIncoming,
sizeof(szIncoming)/sizeof(szIncoming[0]),
0);
strncat(szHistory,szIncoming,inDataLength);
strcat(szHistory,"\r\n");
SendMessage(hEditIn,
WM_SETTEXT,
sizeof(szIncoming)-1,
reinterpret_cast<LPARAM>(&szHistory));
}
break;
case FD_CLOSE:
{
MessageBox(hWnd,
"Server closed connection",
"Connection closed!",
MB_ICONINFORMATION|MB_OK);
closesocket(Socket);
SendMessage(hWnd,WM_DESTROY,NULL,NULL);
}
break;
}
}
答案 0 :(得分:0)
是的,这是完全可以接受的。虽然通常会等到CreateWindow/Ex()
退出,然后再调用WSAAsyncSelect()
。但无论哪种方式都可行。只需确保处理recv()
失败的情况,或返回的字节数少于您要求的字节数。