我这样的代码为什么线程创建后不运行呢?

austin_minny 2010-11-04 07:01:19
我之前的代码运行是正常的,主要代码流程是:
///////////////////////////////////////////////////////////////////////
主线程中:
//建了一个Event和子线程
m_hRdallEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
m_hThrd = CreateThread( NULL, 0, &CLogViewerDlg::ReadTagsThrd,this,0,NULL);
//主线程做一些操作后,设置EVENT为通知态。。。
SetEvent(m_hRdallEvent);
...


在子线程中:
//先做一些操作,然后阻塞,等待事件被触发
WaitForSingleObject(m_hRdallEvent,INFINITE);
//事件触发后做后续操作
////////////////////////////////////////////////////////////////////////////

以上代码运行起来主线程和子线程运行都很正常,可是后来我要在主线程SetEvent调用之后加一个阻塞,等待子线程结束,于是就在SetEvent之后加了一行: WaitForSingleObject(m_hThrd,INFINITE);

而在这之后,程序运行起来就死掉了,一调试,发现是子线程根本没有运行,所以程序死在新加的这句阻塞语句上了,想来想去想不通,向高手求救!
...全文
236 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
austin_minny 2010-11-18
  • 打赏
  • 举报
回复
还是没搞定,结帖了
qsycn 2010-11-05
  • 打赏
  • 举报
回复
如果你的子线程已经结束,
在WaitForSingleObject(m_hRdallEvent,INFINITE); 这个地方一定会返回

估计你的子线程并没有结束,而是(可能由系统)发起了一些需要主线程处理的消息等待主线程返回结果,而主线程正在阻塞中从而导致死锁。
austin_minny 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qsycn 的回复:]
引用楼主 austin_minny 的回复:
在子线程中:
//先做一些操作,然后阻塞,等待事件被触发
WaitForSingleObject(m_hRdallEvent,INFINITE);
//事件触发后做后续操作
////////////////////////////////////////////////////////////////////////////


你的子……
[/Quote]

正常结束了,这个我确认过
chen_freecom 2010-11-05
  • 打赏
  • 举报
回复
CreateEvent(NULL,FALSE,FALSE,NULL);
改成CreateEvent(NULL,TRUE,FALSE,NULL);试试,我怀疑可能重置信号丢失了
erhan_106 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 coding_hello 的回复:]
m_hThrd如果不是NULL的话,线程就创建成功了,没道理没运行。

可以在线程入口处写个日志,WaitForSingleObject(m_hRdallEvent,INFINITE);前面后面写上日志,帮助判断问题。
[/Quote]
帮你顶。
qsycn 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 austin_minny 的回复:]
在子线程中:
//先做一些操作,然后阻塞,等待事件被触发
WaitForSingleObject(m_hRdallEvent,INFINITE);
//事件触发后做后续操作
////////////////////////////////////////////////////////////////////////////
[/Quote]

你的子线程有正常结束吗?
austin_minny 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 coding_hello 的回复:]
m_hThrd如果不是NULL的话,线程就创建成功了,没道理没运行。

可以在线程入口处写个日志,WaitForSingleObject(m_hRdallEvent,INFINITE);前面后面写上日志,帮助判断问题。
[/Quote]

是啊,我调试的时候看到子线程句柄确实是有值的,而且我在子线程入口加了MessageBox,确实是不加那句代码,MessageBox就能弹出来,一加上,就弹不出来了
austin_minny 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 csx007700 的回复:]
呵呵,如果在线程DllMain用WaitForSingleObject等待子线程是会造成死锁的,原因是子线程会等父线程DllMain执行完后才会执行,《windows核心编程》里边有详细介绍。这是我以前一个帖子,给你看下。
http://topic.csdn.net/u/20080709/18/24ce8dfc-4575-4b58-b4c4-30507977ba8c.html
[/Quote]

可是我的场景是在一个对话框程序里面,主线程是对话框的一个消息响应函数,似乎并不是你说的DLLMAIN的那种场景,而且关键是我加了那句代码,子线程压根就没运行,咋回事啊?
csx007700 2010-11-04
  • 打赏
  • 举报
回复
同意楼上 写个日志看看吧
野男孩 2010-11-04
  • 打赏
  • 举报
回复
m_hThrd如果不是NULL的话,线程就创建成功了,没道理没运行。

可以在线程入口处写个日志,WaitForSingleObject(m_hRdallEvent,INFINITE);前面后面写上日志,帮助判断问题。
csx007700 2010-11-04
  • 打赏
  • 举报
回复
呵呵,如果在线程DllMain用WaitForSingleObject等待子线程是会造成死锁的,原因是子线程会等父线程DllMain执行完后才会执行,《windows核心编程》里边有详细介绍。这是我以前一个帖子,给你看下。
http://topic.csdn.net/u/20080709/18/24ce8dfc-4575-4b58-b4c4-30507977ba8c.html

15,471

社区成员

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

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