UI线程中定义事件m_Event
InitInstance函数中添加代码
CMyDlg* pDlg=new CMyDlg;
pDlg->Create(IDD_DIALOG);
pDlg->ShowWindow(SW_HIDE);
m_pMainWnd=pDlg;
....
return之前使用SetEvent(m_Event);主线程中的OnInitDialog函数中,在AfxBeginThread之后
OpenEvent(....);
WaitSingleObject(m_Event,INFINITE);
结果发现程序停在了InitInstance中的
pDlg->Create(IDD_DIALOG);处。
不知道是怎么回事!!!
本人是菜鸟,希望各位大侠不吝指教

解决方案 »

  1.   

    OnInitDialog在WM_INITDIALOG消息响应函数的执行周期中,对话框并没有创建(Create),换句话说,此时UI线程并没有启动,因此 WaitSingleObject(m_Event,INFINITE) 当然无法返回。
      

  2.   

    有道理,但是我现在又发现了一个问题:
    将第一贴中的SetEvent,WaitSingleObject......机制完全除去!主对话框类中定义一个事件
    CEvent IsForePanelResting(FALSE, TRUE, "isforepanelresting",NULL);
    //这里的forepanel指的就是UI线程在InitInstance()中启动的对话框:CMyDlg* pDlg=new CMyDlg;
    pDlg->Create(IDD_DIALOG);
    pDlg->ShowWindow(SW_HIDE);
    m_pMainWnd=pDlg;在UI线程的.cpp文件中声明
    extern CEvent IsForePanelResting;
    这个事件标志的是UI线程对话框处于空闲状态。
    当UI线程开始处理业务的时候会将IsForePanelResting置为无信号,处理业务完毕之后再将IsForePanelResting置为有信号!主对话框(BackPanel)中能够检测按钮按下产生的数字信号量。这些数字信号量的作用就是告知BackPanel应该切换到某个UI线程的对话框。而切换之前必须保证有关当前对话框的业务操作必须完成,就是说当前对话框处于空闲状态:
    ForePanelResting。我现在的做法是检测到某个键按下之后,使用WaitForSingleObject等待IsForePanelResting出现信号。
    然而让我不解的是每当按下按钮,程序进入处理函数后会出现不正常的现象:
    如果UI线程没有改变IsForePanelResting的状态,那么可以在各个界面之间自由切换。如果UI线程改变了IsForePanelResting的状态为FALSE(无信号),那么主线程就会死在WaitForSingleObject(......)的地方!
    我怀疑是不是需要给IsForePanelResting加上个互斥保护?