我想在一个程序的退出时候(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这样的函数,
请问下怎么解决

解决方案 »

  1.   


    OnStart(WPARAM   wParam,   LPARAM   lParam) //   这是开始显示的消息响应函数 

    dlg.Create(IDD_DLG); //这里的IDD_DLG是一个CDialog   类,上面有信息提示内容 
    dlg.ShowWindow(SW_SHOW); 
    dlg.UpdateWindow(); // 加上这个==========
      

  2.   

    另外
    由于你是在OnClose() 
    中处理的,所以消息循环处于阻塞状态,dlg不会得到(任何消息)更新。
    所以使用UpdateWindow()进行手动更新。
      

  3.   

    在OnStart加上dlg.UpdateWindow()了没任何反应,
    楼上的大哥,
    加上了没任何反应,
    涛声依旧
      

  4.   

    这段代码没问题,你可以对照一下。#include "MyDlg.h"
    #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();
    }
      

  5.   

    不用线程也可以啊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();
    }
      

  6.   

    加上消息循环应该可以
    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();
    }
    ........建议还是用多线程
      

  7.   

    最简单的,创建线程还有开销呢
    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();
    }
      

  8.   

    楼上这种方法,虽然可以,但没有任何意义,因为他在显示的过程中,程序是在停止等待状态的,而不是一边去处理退出工作了,这和显示一个提示框:
    "程序将要退出,确认吗?"
    是一样的效率,不过就是不用自己点击关闭罢了,应该一直显示到Destroy()这一步,此时才是离程序退出才是一步之遥.
      

  9.   

    你不就是想在程序退出的时候显示一些信息吗?
    So easy!有2个方案
    1.如果你的程序使用了线程那么首先你的主线程要等待辅助线程的资源释放,这期间你可以做一些处理如显示“正在关闭....”,在辅助线程结束资源的释放后发送给主线程一个事件告诉“老大我的工作已经结束并且释放完毕可以over了”
    这个时候你程序便可End了。
    2.如果你的程序未使用任何的辅助线程那么说只需要释放一些句柄,使用一个while循环更新显示的窗体的提示信息即可。
      

  10.   

    为什么不用事件同步呢,建处理线程的时候置为无信号并 WaitForSingleObject, 线程处理结束置事件有信号,然后    dlg->DestroyWindow(); 
        CMDIFrameWnd::OnClose();