我开了一个线程,在线程里doModal了一个对话框,在启动线程的语句afxbeginthread()之前有个waitsingleobject(g_eventstart,INFINT);问题就是当加了这个waitsingleobject时,我的对话框就不显示了,把waitsingleobject删除了,就能显示,这是怎么回事呀??
---------MyDlg.cpp----------
#include"ProDlg.h"
#include"MyDlg.h"
CEvent g_eventStart;
UINT ProcessThread(LPVOID lParam)
{
CProDlg m_prodlg;
.......
m_prodlg.DoModal();
g_eventStart.SetEvent();

return 0;
}
CMyDlg::function()
{    
         ...........
         ::WaitForSingleObject(g_eventStart,INFINITE);//它的存在对 
                                              // m_proDlg.DoModal()有影响!
::Sleep(200);
AfxBeginThread(ProcessThread, (LPVOID)GetSafeHwnd(),   
                            THREAD_PRIORITY_NORMAL);
g_eventStart.ResetEvent();
}
CMyDlg::OnItiDialog()
{
        g_eventStart.SetEvent();
}
----------------------------------------------

解决方案 »

  1.   

    那当然了,在::WaitForSingleObject(g_eventStart,INFINITE)之前,你并没有设置g_eventStart有信号,而::WaitForSingleObject(g_eventStart,INFINITE)要等g_eventStart有信号的时候才会返回。而你的设置信号的代码又在后面,所以就发生了死锁。
    你这样做吧。
     ...........
              ::Sleep(200);
    AfxBeginThread(ProcessThread, (LPVOID)GetSafeHwnd(),   
                                THREAD_PRIORITY_NORMAL); ::WaitForSingleObject(g_eventStart,INFINITE);//它的存在对  g_eventStart.ResetEvent();
      

  2.   

    zj510(周) :
    有信号的!!!
    在OnInitDialog()不是设置了么?
    而且,当我把  m_prodlg.DoModal();该成MessabeBox()时就不管有没有删除waitsingleobject()都可以执行!
    所以我认为这是关于线程和对话框的问题!