函数A中:
...
dlg.DoModal(); //dlg是一个从CDialog类派生的类的实例
...//语句A
...函数B中:
...
dlg.EndDialog(IDOK);
...//语句B假设正在执行函数B,那么执行完dlg.EndDialog(IDOK);后,下面执行的是哪一句,请分析一下,我想知道这是以什么机制处理该问题的。
补充,上面的函数B是由定时器调用的。
其实我想了解一下,弹出模式对话框后,消息循环的运行情况,哪些消息还在运行,哪些会被阻塞?

解决方案 »

  1.   

    我现在不知道执行哪句。 但这可以用设置断点的方法来看到程序怎样执行
    在dlg.EndDialog(IDOK);处下一断点,运行到此处程序自然停下来,再单步执行就能看到
      

  2.   

    看不懂你的问题。
    你是指调试吗?直接在语句A中断不行吗?
    实在不行可以在DLG内选断点。
      

  3.   

    我觉得是各执行各的,A函数执行DoModal()返回, 继续执行A语句;而定时器B函数继续执行B语句.同时执行是可行的
      

  4.   

    如果执行dlg.DoModal(),B就不会被执行了.因为其它窗口被Disable了 -------------个人关点
      

  5.   

    dlg DoModal后,A暂时不会被执行;
    dlg EndDialog后,B就不会被执行,dlg返回到A处,A开始执行。
    不知道对不对?
      

  6.   

    void CDialog::EndDialog(int nResult)
    {
    ASSERT(::IsWindow(m_hWnd)); if (m_nFlags & (WF_MODALLOOP|WF_CONTINUEMODAL))
    EndModalLoop(nResult); ::EndDialog(m_hWnd, nResult);
    }
      

  7.   

    // winuser.h
    //
    // #define IN
    // #define OUTWINUSERAPI
    BOOL
    WINAPI
    EndDialog(
        IN HWND hDlg,
        IN INT_PTR nResult);
      

  8.   

    Windows里面,要一个消息处理完了才处理下一个,EndDialog只不过在消息队列里面加上了一个WM_DESTROY或者什么类似的结束窗口的消息。而这个消息,现在还不会立即处理,只有等到,你的那个TIMER 的消息处理完了之后才处理