我想在一个程序的退出时候(WM_CLOSE)显示一些信息, 程序退出的时候要进行一些清理工作,在清理过程中提示“程序马上退出,等待”,我是这样做的,但是不行。
线程类 CUIThread
xx.h
CDLG dlg; //窗口类 派生来自 CDialogxx.cpp
OnStart(WPARAM wParam, LPARAM lParam) // 这是开始显示的消息响应函数
{
dlg.Create(IDD_DLG); //这里的IDD_DLG是一个CDialog 类,上面有信息提示内容
dlg.ShowWindow(SW_SHOW);
}
OnEnd(WPARAM wParam, LPARAM lParam) //这是结束显示的消息响应函数
{
dlg.DestroyWindow();
}CMainFrame //类
xx.h
CUIThread ThreadInfo;
xx.cpp
OnClose()
{
this->ThreadInfo.CreateThread();
this->ThreadInfo.PostThreadMessage(WM_THREAD_START, 0, 0); /*一些消耗时间的处理,或者是循环*/ //我就是想在这里显示一个窗口提示"正在忙". this->ThreadInfo.PostThreadMessage(WM_THREAD_END, 0, 0); //结束这个窗口的显示
CMDIFrameWnd::OnClose();
}我如果在按钮上做的话,一个是显示,一个结束,正常可以,
而在退出函数中做不行,
估计是Post Message的问题,但是没得Send Message这样的函数,
请问下怎么解决
线程类 CUIThread
xx.h
CDLG dlg; //窗口类 派生来自 CDialogxx.cpp
OnStart(WPARAM wParam, LPARAM lParam) // 这是开始显示的消息响应函数
{
dlg.Create(IDD_DLG); //这里的IDD_DLG是一个CDialog 类,上面有信息提示内容
dlg.ShowWindow(SW_SHOW);
}
OnEnd(WPARAM wParam, LPARAM lParam) //这是结束显示的消息响应函数
{
dlg.DestroyWindow();
}CMainFrame //类
xx.h
CUIThread ThreadInfo;
xx.cpp
OnClose()
{
this->ThreadInfo.CreateThread();
this->ThreadInfo.PostThreadMessage(WM_THREAD_START, 0, 0); /*一些消耗时间的处理,或者是循环*/ //我就是想在这里显示一个窗口提示"正在忙". this->ThreadInfo.PostThreadMessage(WM_THREAD_END, 0, 0); //结束这个窗口的显示
CMDIFrameWnd::OnClose();
}我如果在按钮上做的话,一个是显示,一个结束,正常可以,
而在退出函数中做不行,
估计是Post Message的问题,但是没得Send Message这样的函数,
请问下怎么解决
解决方案 »
- CreateCompatibleBitmap是什么对象Compatible什么对象?
- VC++编译连接问题-请高手来帮忙(急!!!!)
- 为什么无法定义头文件?
- 高分求助,怎样通过ActiveX得到上一级网页的地址
- 一个阻塞中的工作线程,该如何结束它?
- 讨论下,能否象动态创建控件一样动态创建函数呢???
- 编程语言要学很多吗?只学VC行吗?
- 请教高手!!!!!!!!!!
- Bardo(巴顿):请进入领分...............................
- 有谁用过NETRESOURCE结构?
- 看了很多MFC传递自定义消息还是不明白,请指点下!敬谢!
- 如何得到滚动窗口的大小(用像素值表示)?
OnStart(WPARAM wParam, LPARAM lParam) // 这是开始显示的消息响应函数
{
dlg.Create(IDD_DLG); //这里的IDD_DLG是一个CDialog 类,上面有信息提示内容
dlg.ShowWindow(SW_SHOW);
dlg.UpdateWindow(); // 加上这个==========
}
由于你是在OnClose()
中处理的,所以消息循环处于阻塞状态,dlg不会得到(任何消息)更新。
所以使用UpdateWindow()进行手动更新。
楼上的大哥,
加上了没任何反应,
涛声依旧
#include <process.h>unsigned int
WINAPI t_cli(void* pParam)
{
CMyDlg* dlg = new CMyDlg();
dlg->Create(IDD_DIALOG1 );
dlg->ShowWindow(SW_SHOW );
dlg->UpdateWindow(); Sleep(10 * 1000); dlg->DestroyWindow(); return 0;
}void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
UINT nID = 0;
HANDLE hThread = (HANDLE)::_beginthreadex(NULL, 0, t_cli, this, 0, &nID); Sleep(10 * 1000); ::CloseHandle(hThread ); CMDIFrameWnd::OnClose();
}
{
// TODO: Add your message handler code here and/or call default
CMyDlg* dlg = new CMyDlg(); dlg->Create(IDD_DIALOG1 );
dlg->ShowWindow(SW_SHOW );
dlg->UpdateWindow(); Sleep(10 * 1000); dlg->DestroyWindow(); CMDIFrameWnd::OnClose();
}
void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
CMyDlg* dlg = new CMyDlg(); dlg->Create(IDD_DIALOG1 );
dlg->ShowWindow(SW_SHOW ); While(GetMessage(.......))
{
DispathMessage(.............)
}
dlg->DestroyWindow(); CMDIFrameWnd::OnClose();
}
........建议还是用多线程
void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
CMyDlg* dlg = new CMyDlg(); dlg->Create(IDD_DIALOG1 );
dlg->ShowWindow(SW_SHOW );
dlg->UpdateWindow(); Sleep(10 * 1000); dlg->DestroyWindow(); CMDIFrameWnd::OnClose();
}
"程序将要退出,确认吗?"
是一样的效率,不过就是不用自己点击关闭罢了,应该一直显示到Destroy()这一步,此时才是离程序退出才是一步之遥.
So easy!有2个方案
1.如果你的程序使用了线程那么首先你的主线程要等待辅助线程的资源释放,这期间你可以做一些处理如显示“正在关闭....”,在辅助线程结束资源的释放后发送给主线程一个事件告诉“老大我的工作已经结束并且释放完毕可以over了”
这个时候你程序便可End了。
2.如果你的程序未使用任何的辅助线程那么说只需要释放一些句柄,使用一个while循环更新显示的窗体的提示信息即可。
CMDIFrameWnd::OnClose();