各位看看有没有更好的办法?
兄弟我用一个线程(AfxBeginThread)更新某对话框中的CListCtrl,但不可避免地要在对话框退出前终止线程,但是试了ExitThread,delete等,都无法在窗体销毁前终止线程(我很奇怪,难道这与线程中执行了一个长时间API调用有关?),为此,我不得已采用CEvent来解决这个问题,添加了两个事件,如下:
CEvent g_eventListOUDone; //线程工作完成事件
CEvent g_eventQuitListOU; //退出线程事件
在对话框的OnDestroy中设置g_eventQuitListOU事件,然后等待g_eventListOUDone事件,结果竟然出现了死锁,怎么回事?
以下是部分代码:
//线程工作函数
UINT ListOnlineUser(LPVOID pParam)
{
CNotepadDlg* pDlg = (CNotepadDlg*)pParam;
...
for (int i = 0; i < nCount; i++)
{
if (WaitForSingleObject(g_eventQuitListOU.m_hObject, 0) == WAIT_OBJECT_0)
break;
//操作CListCtrl
...
}
g_eventListOUDone.SetEvent();
return 0;
}
//OnDestroy
void CNotepadDlg::OnDestroy()
{
if (m_pListOUThread != NULL) //m_pListOUThread是工作线程指针
{
g_eventQuitListOU.SetEvent();
WaitForSingleObject(g_eventListOUDone.m_hObject, INFINITE);
}
CDialog::OnDestroy();
}