数据库操作函数,操作数据库时候有个动作非常耗时,我希望能够给用户一个界面提示进度。但是数据库操作又没有回调机制,所以考虑显示一个循环的进度指示告诉用户程序还在运行,别担心死机什么的。实现思路如下: ADODataFetch()
{
.....//考虑这里显示一个非模态窗口,显示一个进度条指示用户
CProgressDlg progressDlg;
progressDlg.Create(....);
progressDlg.CenterWindow();
progressDlg.ShowWindow(SW_SHOW);
//
ADODataOperation();//这一步非常耗时,可能要数分钟时间
.....
progressDlg.DestroyWindow();//销毁进度指示窗口
}//CProgressDlg类
创建一个Dialog,在初始化里面添加一个CProgressCtrl,创建一个Timer,然后通过OnTimer()增加进度条进度我发现生成Progress指示窗口后,进度条并没有动,也被阻塞了。请各位帮忙看看问题处在哪里?我的要求能够实现么?

解决方案 »

  1.   

     ADODataFetch() 

    ..... //考虑这里显示一个非模态窗口,显示一个进度条指示用户 
    CProgressDlg progressDlg; 
    progressDlg.Create(....); 
    progressDlg.CenterWindow(); 
    progressDlg.ShowWindow(SW_SHOW); 
    // 
    ADODataOperation();//这一步非常耗时,可能要数分钟时间 
    ..... 
    progressDlg.DestroyWindow();//销毁进度指示窗口 

    CProgressDlg progressDlg; // 这个对话框的创建和销毁放在类的初始化和析构中做;DWORD WINAPI ADOOper(LPVOID lpVoid)
    {
        HWND hWnd = *((HWND*)lpVoid);
        ADODataOperation();     // 进度条通过向窗口句柄发消息终止:
        ::PostMessage(hWnd, WM_DESTROY, 0, 0);
        return 0;
    }ADODataFetch() 

        progressDlg.CenterWindow(); 
        progressDlg.ShowWindow(SW_SHOW); // 接着开始模拟进度显示,退出由线程发消息通知
        
        DWORD dwID = 0;
        CreateThread(NULL, 0, ADOOper, &progressDlg.m_hWnd, 0, &dwID);
      

  2.   

    多谢楼上的xd,我的那种方法是不是出现了消息阻塞?利用Create创建的无模式对话框消息也是经过所在视图的消息序列么?当然利用你说的多线程,是不是就不会造成消息阻塞,所以可行。请指点,谢谢!
      

  3.   

    请大家帮忙看看,我的这种方式Create无模式对话框显示模拟进度指示条,是不是出现了消息阻塞???