读书人

MFC下使用WaitForSingleObject的界面卡

发布时间: 2014-04-20 16:40:37 作者: rapoo

MFC下使用WaitForSingleObject的界面卡逼问题
MFC下主程序调用WaitForSingleObject函数 界面被卡住 请大侠们帮忙解决
部分源码如下:
BOOL CIOCP::MainLoop()
{
DWORDdwRet;
intnCount = 0;
MSG("server is running");

while( TRUE )
{
dwRet = WaitForSingleObject( m_h_accept_event, 10000 );

switch( dwRet )
{

case WAIT_FAILED:
{
PostQueuedCompletionStatus( m_h_iocp, 0, 0, NULL );

return FALSE;
}
break;
case WAIT_TIMEOUT:
{
if( nCount > 1000 )
{
nCount = 0;
}

//cout << "Server is running.........." << nCount++ << " times" << endl;
nCount++;
//CheckForInvalidConnection();
}
break;
case WAIT_OBJECT_0://接收到了所有发出的连接都用光了的消息,再次发出连接
{

if( !PostAcceptEx() )
{
PostQueuedCompletionStatus( m_h_iocp, 0, 0, NULL );

return FALSE;
}
}
break;
}
}
return TRUE;
}
/*-------------------------------------------------------
函数功能:注册FD_ACCEPTG事件到m_h_accept_event事件,以便所有发出去的连接耗耗尽时,得到通知。
函数说明:
函数返回:成功,TRUE;失败,FALSE
-------------------------------------------------------*/
BOOL CIOCP::RegAcceptEvent()
{
intnRet;

m_h_accept_event = CreateEvent( NULL, FALSE, FALSE, NULL );

if( NULL == m_h_accept_event )
{
return FALSE;
}

nRet = WSAEventSelect( m_listen_socket, m_h_accept_event, FD_ACCEPT );

if( nRet != 0 )
{
CloseHandle( m_h_accept_event );

return FALSE;
}

return TRUE;
}

[解决办法]
你不能放到线程函数中去做吗?
[解决办法]
dwRet = WaitForSingleObject( m_h_accept_event, 10000 );

本身,就会导致界面等待m_h_accept_event 10秒钟,界面就会停止响应10秒,知道超时或者对象m_h_accept_event释放

换种方式吧,例如到线程中去Wait
[解决办法]
我觉得如果你要 waitforobject...还不如先 showwindow(SW_HIDE)呢
[解决办法]
如果你在消息响应函数中,调用了WaitForSingleObject类似的函数,都会让消息阻塞掉的,因为这些消息都是要处理完成才返回,如果你WaitForSingleObject了,就会把消息循环阻塞掉了

读书人网 >VC/MFC

热点推荐