今日写了一个小MFC程序,在创建一个对话框的同时创建一个线程,线程里同时等待对话框的close事件和socket的读事件,调用的等待函数是 WSAWaitForMultipleEvents,收到close事件后线程退出,对话框在OnClose响应函数中先发送close时间,然后调用系统的OnClose函数。
线程函数:
WSAEVENT szEvent[2];
szEvent[0] = pDlg->m_hCloseEvent;//对话框发送的close事件
szEvent[1] = hReadEvent;//socket的读事件
int quit = 0;
do
{
//err = WSAWaitForMultipleEvents(2, szEvent, FALSE, WSA_INFINITE, TRUE);
err = WaitForMultipleObjects(2, szEvent, FALSE, WSA_INFINITE);
switch(err)
{
case WSA_WAIT_EVENT_0 :
quit = 1;
break;
case WSA_WAIT_EVENT_0 + 1:
{
接收数据;
break;
}
case WSA_WAIT_FAILED:
quit = 1;
break;
default:
quit = 0;
break;
}
}while(!quit);
对话框OnClose响应函数:
void CdebugDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
if(WSASetEvent(m_hCloseEvent) == TRUE)
{
if(WaitForSingleObject(m_hMain, 5000) == WAIT_TIMEOUT)//等待线程退出
{
AfxMessageBox("Thread has exit!");
}
}
CloseHandle(m_hCloseEvent);
CDialog::OnClose();
}
没想到这么简单的一个程序在调试时居然出了问题,如果socket没有收到数据,关闭对话框,那么线程就会先收到close事件,然后对话框才会调用系统OnClose函数关闭;如果socket处于数据传送过程,线程却在对话框OCDialog::nClose响应完毕后才收到close事件。
郁闷了半天为什么会出现这种情况,实在是无法理解。