各位看看有没有更好的办法?

billdavid 2003-05-11 05:18:06
兄弟我用一个线程(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();
}
...全文
20 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
billdavid 2003-05-14
  • 打赏
  • 举报
回复
已搞定,原来并没有死锁,只是线程函数没有执行完操作,没有回到检查点,再等等就好了。
videojet 2003-05-12
  • 打赏
  • 举报
回复
//线程工作函数
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();
}
herrycsdn 2003-05-11
  • 打赏
  • 举报
回复
关注学习

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧