我之前的代码运行是正常的,主要代码流程是:
///////////////////////////////////////////////////////////////////////
主线程中:
//建了一个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);而在这之后,程序运行起来就死掉了,一调试,发现是子线程根本没有运行,所以程序死在新加的这句阻塞语句上了,想来想去想不通,向高手求救!

解决方案 »

  1.   

    呵呵,如果在线程DllMain用WaitForSingleObject等待子线程是会造成死锁的,原因是子线程会等父线程DllMain执行完后才会执行,《windows核心编程》里边有详细介绍。这是我以前一个帖子,给你看下。
    http://topic.csdn.net/u/20080709/18/24ce8dfc-4575-4b58-b4c4-30507977ba8c.html
      

  2.   

    m_hThrd如果不是NULL的话,线程就创建成功了,没道理没运行。可以在线程入口处写个日志,WaitForSingleObject(m_hRdallEvent,INFINITE);前面后面写上日志,帮助判断问题。
      

  3.   


    可是我的场景是在一个对话框程序里面,主线程是对话框的一个消息响应函数,似乎并不是你说的DLLMAIN的那种场景,而且关键是我加了那句代码,子线程压根就没运行,咋回事啊?
      

  4.   


    是啊,我调试的时候看到子线程句柄确实是有值的,而且我在子线程入口加了MessageBox,确实是不加那句代码,MessageBox就能弹出来,一加上,就弹不出来了
      

  5.   

    CreateEvent(NULL,FALSE,FALSE,NULL);
    改成CreateEvent(NULL,TRUE,FALSE,NULL);试试,我怀疑可能重置信号丢失了
      

  6.   

    如果你的子线程已经结束,
    在WaitForSingleObject(m_hRdallEvent,INFINITE); 这个地方一定会返回估计你的子线程并没有结束,而是(可能由系统)发起了一些需要主线程处理的消息等待主线程返回结果,而主线程正在阻塞中从而导致死锁。