一个MFC的 函数中
{
CDlg dlg;
dlg.DoModal();
WaitForSingleObject(p.hProcess);//等待一个执行的进程结束
dlg.EndDialog();//这一步怎么释放该对话框!
AfxMessageBox("程序运行完毕");
}
以上代码无法消除模式对话框dlg,请极速赐教,谢谢 加分啊 ~~
{
CDlg dlg;
dlg.DoModal();
WaitForSingleObject(p.hProcess);//等待一个执行的进程结束
dlg.EndDialog();//这一步怎么释放该对话框!
AfxMessageBox("程序运行完毕");
}
以上代码无法消除模式对话框dlg,请极速赐教,谢谢 加分啊 ~~
解决方案 »
- 属性页编程的一个疑问
- 窗口的过程函数,感觉本质上就是一个死循环吧,为何不占尽资源呢?
- 请教:VC生成Excel柱状图
- 对话框资源和类的关系?
- 关于cryptoapi解析p12证书的问题
- 抢分的赶快哦 关于删除指定目录下的指定文件的函数(分数不高 但问题一解决立即结账)
- 请问哪里有《OLE技术内幕》中文版下载??
- 请玩kele8台球的编程高手帮我一个忙!
- 实现IMarshal接口,编译的时候报 “不能实例化抽象类 ”
- 求助: PE文件和NE文件的分别处, segment table 和 section table 概念不同?
- smtp发邮件,sina的不可以发,163可以,高手帮忙啊
- 导致socket出现“远程主机强迫关闭了一个现有的连接”的原因有哪些?
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));
WaitForSingleObject()函数运行完毕后也要阻塞消息吗 ?能不能说详细点
还有,我用的是模式对话框,不是模式对话框在显示的时候独享消息队列吗?
另外,以上代码等我回去研究下,在此谢谢 了 ~
{
WaitForSingleObject(p.hProcess);//等待一个执行的进程结束
dlg.EndDialog();//这一步怎么释放该对话框!
AfxMessageBox("程序运行完毕");
}
这三条语句并不执行。
但是消息却是依旧可以被处理的,原因应该是DoModal();里面有
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
之类的语句。所以如果要那三条在对话框返回之前执行,可以在DoModal();之前PostMessage一个自定义消息,然后在消息处理函数里面执行这三条语句。
dlg.EndDialog();
只能改成
成员变量指针->EndDialog();了
也就是
{
CDlg dlg;
成员变量指针=&dlg;
PostMessage(自定义消息);
dlg.DoModal();
}
自定义消息处理函数
{
WaitForSingleObject(p.hProcess);//等待一个执行的进程结束
成员变量指针->EndDialog();//这一步怎么释放该对话框!
AfxMessageBox("程序运行完毕");
}
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("程序运行完毕");
}
LRESULT Cxxx::OnMessage(WPARAM wParam,LPARAM lParam)
{
WaitForSingleObject(p.hProcess);//等待一个执行的进程结束
if (m_pWnd)
{
m_pWnd->EndDialog();//这一步怎么释放该对话框!
m_pWnd=NULL;
}
AfxMessageBox("程序运行完毕");
}
不过LZ这问题,真的还不如用new+Create+EnableWindow去处理要好些。
CDlg dlg;
m_pWnd=&dlg;
PostMessage(WM_USER+1);//这里应该是调用映射的那个函数吧
dlg.DoModal();//在调用上面函数结束后才显示对话框
也就是跟我的要求不一致了,我的意思是在主程序运行一个程序的时候,弹出一个对话框,提示程序正在运行,等到程序运行完毕后结束该对话框。而上面的顺序不对了~
在DoModal之前把对话框的对象指针传入该线程
然后把
WaitForSingleObject(p.hProcess);//等待一个执行的进程结束
dlg.EndDialog();//这一步怎么释放该对话框!
AfxMessageBox("程序运行完毕");
这几句代码放入新建线程内!
个人想法!不知道正确与否!
拜托,你要分清 PostMessage跟 SendMessage的区别,前者只是发个消息到消息队列,这时对应的函数并不会执行,直到执行DoModal()创建完窗体以后,在其内部以下代码循环的时候
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Post的消息才被取出来执行,顺序是没有问题的,但SendMessage就不行了。
还是有阻塞的!
dlg.DoModal()无法在显示。
所以我感觉阻塞肯定还是会存在!
还有w_anthony()说的
拜托,你要分清 PostMessage跟 SendMessage的区别,前者只是发个消息到消息队列,这时对应的函数并不会执行,直到执行DoModal()创建完窗体以后,在其内部以下代码循环的时候
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Post的消息才被取出来执行,顺序是没有问题的,但SendMessage就不行了。如果窗体创建前就往该窗体发送消息那很容易会出错的!
还有你上面写的代码消息处理函数是在主对话框上,又不是在刚创建的dlg上建议楼主在创建一条线程解决这个问题!
是发给主窗口,不是发给要创建的窗口。
你写个小程序试一下不就知道执行顺序了么?(不要用MessageBox去试顺序,那可能会导致顺序错乱,可以写写文件看顺序)
{
m_pWnd->MoveWindow(0,0,300,300);
m_pWnd->ShowWindow(SW_SHOW);
}
人为让他显示出来了
m_pWnd->ShowWindow(SW_SHOW);
加这个吗?
如果是创建模态对话框,那这两句代码肯定会出错!
如果要创建非模态的!
那问题就很简单了,没必要讨论了!
你还不如直接给对话框发送关闭消息呢
个人认为用WaitForSingleObject在此无用。除非你对话框关闭后到这儿之间有其它代码!
拜托你把他加到消息处理函数的里面的最前面试一下,然后再来发表一下意见