线程不能退出,求大神帮忙看看

a469367940 2013-05-16 10:03:50
BOOL CSignalDlg::Init(const int nSourceID )
{
UNREFERENCED_PARAMETER(nSourceID);
m_hExitEvent = ::CreateEvent( NULL, TRUE, FALSE, NULL );
if( m_hExitEvent == NULL)
{
//SafeSprintf( lpErrorMsg, nSize, "%s", "CreateEvent 失败!!!" );
return FALSE;
}
return TRUE;
};

void CSignalDlg::Exit()
{
SetEvent(m_hExitEvent);
WaitForSingleObject(m_hHandle, INFINITE);
// AfxMessageBox("线程已经退出!");
}

LONG CSignalDlg::DoJob()
{
while (1)
{
// 等待退出事件
if(WaitForSingleObject(m_hExitEvent, 100) == WAIT_OBJECT_0)
{
AfxMessageBox("线程退出!");
break;
}
m_data++;
CString data;
data.Format("%d", m_data);
m_edit.SetWindowText(data);
}
// AfxMessageBox("线程退出!");
return 0;
}

//上述代码的意思是我在主线程中发信号给子线程让子线程退出,并且主线程等待着子线程完全退出,
但是我发现我发了信号后界面就卡着了,跟踪发现子线程并没有退出。求大神帮忙解决。
注:线程函数中调用doJob()
...全文
106 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
看不见的裂痕 2013-06-07
  • 打赏
  • 举报
回复
貌似解决了,记得结贴哦
lm_whales 2013-06-06
  • 打赏
  • 举报
回复
AfxMessagebox 弹出的对话框在后面或者最小化了,结果看不到; 所以没法点击关闭;所以程序就死在这里了。 可以把这个消息写在界面上; 另外,等待是可以处理消息循环,不同等100MS
a469367940 2013-05-16
  • 打赏
  • 举报
回复
谢谢两位的回复,我在break之前加上了AfxMessagebox就会出现这种情况,注释掉了,线程就能正确退出,问了一个牛人他说退出时干活了,闪了一下没有明白是啥意思
dahaiI0 2013-05-16
  • 打赏
  • 举报
回复
调试下,最好把线程代码也写上来,就这点代码目测有可能发生死锁,比如主线程点了退出,然后一直阻塞直到子线程退出,但是如果子线程此时刚好运行到m_edit.SetWindowText(data);时就会死锁,SetWindowText内部是通过SendMessage来实现,跨线程SendMessage会让当前线程挂起,直到对方响应完才返回,而此时主线程还处于阻塞状态,因为在wait子线程句柄。 另外最好不要在子线程操作主线程的UI。
向立天 2013-05-16
  • 打赏
  • 举报
回复
if(WaitForSingleObject(m_hExitEvent, 100) == WAIT_OBJECT_0) 你这里这样写试试 if(WaitForSingleObject(m_hExitEvent, INFINITE) == WAIT_OBJECT_0)

15,473

社区成员

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

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