一个MFC的 函数中
{
   CDlg dlg;
   dlg.DoModal();
   WaitForSingleObject(p.hProcess);//等待一个执行的进程结束
   dlg.EndDialog();//这一步怎么释放该对话框!
   AfxMessageBox("程序运行完毕");
}
以上代码无法消除模式对话框dlg,请极速赐教,谢谢 加分啊 ~~

解决方案 »

  1.   

    WaitForSingleObject造成消息阻塞,你如果要等待,用下面方法,加在dlg.DoModal后面:
    MSG msg;
    DWORD ret;
    do
    {
    ret = MsgWaitForMultipleObjects(1, &p.hProcess, FALSE, QS_ALLINPUT);
    while (PeekMessage(NULL, 0, 0, PM_REMOVE)
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }while ((ret != WAIT_FAILED) && (ret != WAIT_OBJECT_0));
      

  2.   

    自动释放的,你需要释放你自己new出来的东西,其它的不需要管
      

  3.   

    yjgx007(听妈妈的话) 
    WaitForSingleObject()函数运行完毕后也要阻塞消息吗 ?能不能说详细点
    还有,我用的是模式对话框,不是模式对话框在显示的时候独享消息队列吗?
       另外,以上代码等我回去研究下,在此谢谢 了 ~
      

  4.   

    调用一个OnOK/Oncancel等,模拟点击关闭
      

  5.   

    顶楼代码在dlg.DoModal();返回之前,也就是对话框关闭之前,
    {
       WaitForSingleObject(p.hProcess);//等待一个执行的进程结束
       dlg.EndDialog();//这一步怎么释放该对话框!
       AfxMessageBox("程序运行完毕");
    }
    这三条语句并不执行。
    但是消息却是依旧可以被处理的,原因应该是DoModal();里面有
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    之类的语句。所以如果要那三条在对话框返回之前执行,可以在DoModal();之前PostMessage一个自定义消息,然后在消息处理函数里面执行这三条语句。
      

  6.   

    当然消息处理函数里面
    dlg.EndDialog();
    只能改成
    成员变量指针->EndDialog();了
    也就是
    {
       CDlg dlg;
    成员变量指针=&dlg;
    PostMessage(自定义消息);
       dlg.DoModal();
    }
    自定义消息处理函数
    {
       WaitForSingleObject(p.hProcess);//等待一个执行的进程结束
       成员变量指针->EndDialog();//这一步怎么释放该对话框!
       AfxMessageBox("程序运行完毕");
    }
      

  7.   

    假设你说的这个MFC的这个函数名为fun,他所在的类名为Cxxx;
    1、首先在Cxxx的h里面定义里面加一个成员变量
    CWnd* m_pWnd;
    2、然后fun改为
    void Cxxx::fun()
    {
       CDlg dlg;
       m_pWnd=&dlg;
       PostMessage(WM_USER+1);
       dlg.DoModal();
       m_pWnd=NULL;
    }
    3、在Cxxx的cpp中BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间加上
    ON_MESSAGE(WM_USER+1,OnMessage)
    4、增加成员函数
    {
       WaitForSingleObject(p.hProcess);//等待一个执行的进程结束
       if (m_pWnd)
       {
          m_pWnd->EndDialog();//这一步怎么释放该对话框!
          m_pWnd=NULL;
       }
       AfxMessageBox("程序运行完毕");
    }
      

  8.   

    4、增加成员函数
    LRESULT Cxxx::OnMessage(WPARAM wParam,LPARAM lParam)
    {
       WaitForSingleObject(p.hProcess);//等待一个执行的进程结束
       if (m_pWnd)
       {
          m_pWnd->EndDialog();//这一步怎么释放该对话框!
          m_pWnd=NULL;
       }
       AfxMessageBox("程序运行完毕");
    }
      

  9.   

    LZ的意思到底是什么,释放对话框?对话框的关闭在相应对话框的用户操作来执行,或者说LZ需要的是非模态对话框
      

  10.   

    其实我觉得如果一定要用DoModal()的话,估计差不多可以按我上面说的写。
    不过LZ这问题,真的还不如用new+Create+EnableWindow去处理要好些。
      

  11.   

    无模式对话框,能不能像模式对话框那样拦截用户的操作呢?还有,以上代码好像不能:
       CDlg dlg;
       m_pWnd=&dlg;
       PostMessage(WM_USER+1);//这里应该是调用映射的那个函数吧
       dlg.DoModal();//在调用上面函数结束后才显示对话框
    也就是跟我的要求不一致了,我的意思是在主程序运行一个程序的时候,弹出一个对话框,提示程序正在运行,等到程序运行完毕后结束该对话框。而上面的顺序不对了~
      

  12.   

    DoModal()要在点了OK或cancel后才返回....而点OK,或Cancel引起的OnOk(),OnCancel()都会自动调用Enddialog()的......然后才返回!!!!你这样写都已经EndDialog了,再去调用一个EndDialog,当然错了!
      

  13.   

    DoModal()要在点了OK或cancel后才返回....而点OK,或Cancel引起的OnOk(),OnCancel()都会自动调用Enddialog()的......然后才返回!!!!你这样写都已经EndDialog了,再去调用一个EndDialog,当然错了!
      

  14.   

    再开启一线程
    在DoModal之前把对话框的对象指针传入该线程
    然后把
    WaitForSingleObject(p.hProcess);//等待一个执行的进程结束
    dlg.EndDialog();//这一步怎么释放该对话框!
    AfxMessageBox("程序运行完毕");
    这几句代码放入新建线程内!
    个人想法!不知道正确与否!
      

  15.   

    To ppoo24()
    拜托,你要分清 PostMessage跟 SendMessage的区别,前者只是发个消息到消息队列,这时对应的函数并不会执行,直到执行DoModal()创建完窗体以后,在其内部以下代码循环的时候
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    Post的消息才被取出来执行,顺序是没有问题的,但SendMessage就不行了。
      

  16.   

    不过感觉w_anthony()的方法还是有问题的!
    还是有阻塞的!
    dlg.DoModal()无法在显示。
      

  17.   

    postmessage会立即返回,但是消息处理函数还是在该线程内!
    所以我感觉阻塞肯定还是会存在!
    还有w_anthony()说的
    拜托,你要分清 PostMessage跟 SendMessage的区别,前者只是发个消息到消息队列,这时对应的函数并不会执行,直到执行DoModal()创建完窗体以后,在其内部以下代码循环的时候
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    Post的消息才被取出来执行,顺序是没有问题的,但SendMessage就不行了。如果窗体创建前就往该窗体发送消息那很容易会出错的!
    还有你上面写的代码消息处理函数是在主对话框上,又不是在刚创建的dlg上建议楼主在创建一条线程解决这个问题!
      

  18.   

    LS,那是PostMessage(WM_USER+1);不是m_pWnd->PostMessage(WM_USER+1);
    是发给主窗口,不是发给要创建的窗口。
    你写个小程序试一下不就知道执行顺序了么?(不要用MessageBox去试顺序,那可能会导致顺序错乱,可以写写文件看顺序)
      

  19.   

    突然想到一个比较严重的问题,执行WM_USER+1对应的消息处理函数的时候,窗体的确是已经创建出来了(你可以在消息处理函数GetDlgItem(ID)->ShowWindow()去尝试是否可以隐藏或显示一些控件),但是窗体创建出来以后,还有WM_SIZE,WM_PAINT之类的消息在WM_USER+1之后,结果会导致窗体显示不出来-_-b
      

  20.   

    看到只有消息处理函数的最前面加上
    {
       m_pWnd->MoveWindow(0,0,300,300);
       m_pWnd->ShowWindow(SW_SHOW);
    }
    人为让他显示出来了
      

  21.   

    m_pWnd->MoveWindow(0,0,300,300);
    m_pWnd->ShowWindow(SW_SHOW);
    加这个吗?
    如果是创建模态对话框,那这两句代码肯定会出错!
    如果要创建非模态的!
    那问题就很简单了,没必要讨论了!
      

  22.   

    模太对话框需要点击OK或是CANCEL才能结束,这样才会继续执行后边的WaitForSingleObject。否则一下会在对话框显示那儿等待!!!
    你还不如直接给对话框发送关闭消息呢
    个人认为用WaitForSingleObject在此无用。除非你对话框关闭后到这儿之间有其它代码!
      

  23.   

    To zhejiang9(小胡)
    拜托你把他加到消息处理函数的里面的最前面试一下,然后再来发表一下意见