当用户点击用户界面的某一按钮的时候,通知辅助线程进行事务处理,需要消耗一定的时间。 这个时候希望弹出一个对话框,告知用户正在处理。
     这样怎么实现呢?
   
     我自己从CDialog 派生了一个含有进度条的类 CProgDlg theDlg;
     
     但是无法显示出来     线程里面能不能生成对话框阿? 即:       CProgDlg theDlg;
      theDlg.modal();

解决方案 »

  1.   

    CProgDlg theDlg;
          theDlg.modal(); //必然等到这个函数返回之后,它下面的代码才能接着执行你可以将线程写进该对话框类内部,在 OnInitilDlg ( )中启动线程, 然后在线程中访问对话框中的进度条,控制它变化
      

  2.   

    谢谢大家
     这几天没能上网 
       
       我按照大家的 建议 在线程里面使用了 非模式对话框    UINT CMobileComm::MobileThread(LPVOID lpParam)
      {
         ...........
         ProgessDlg = new CProgDlg( );
         AfxMessageBox("对话框1");
         if( ProgessDlg->Create(IDD_MY_PROGDLG, p->m_powner) == TRUE )
          AfxMessageBox("对话框2");
         ProgessDlg->ShowWindow(SW_SHOW);
         ...........
       }p->m_powner是对话框(进度条对话框)的父窗口  我把它指向程序的CMainFrame但是每次显示的时候 对话框总是在 程序的左上角显示出来 不知道怎么样调整它的位置还有 每次运行的时候都出这个错误:
        Debug Assertion Failed!
        File: wincore.cpp
        line: 883   我看了 wincore.cpp的883行 是这个语句:
       ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||
    (p = pMap->LookupTemporary(m_hWnd)) != NULL);向请教一下大家这是怎么回事?
      

  3.   

    >>但是每次显示的时候 对话框总是在 程序的左上角显示出来 不知道怎么样调整它的位置将对话框的父窗口设为程序主窗口(比如mainframe)就可以了。
      

  4.   

    哦,忘了一句:还要在对话框资源的属性里设下那个cente~
      

  5.   

    谢谢
    这个我已经实现过了但是在debug模式下面 总是弹出这个Assert 错误的窗口
    不知道怎么回事
      

  6.   

    up
    线程中
    非模态对话框 create的时候
    父窗口的指针 应该怎么指定啊?  有什么特别的要求吗?  
      

  7.   

    Assert 错误的窗口,啥内容?
      

  8.   

    ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||
    (p = pMap->LookupTemporary(m_hWnd)) != NULL);
    表明你使用了其他线程创建的MFC对象
    参见http://blog.csdn.net/jiangsheng/archive/2004/01/05/3797.aspx
      

  9.   

    如果你用的vc6.0的话,里面有个Vc组件做得很棒.用Vc6.0生成后可在vc.net用.
    'project'->'Add to project'->'Components and Controls'->'Visual C++ Components'->'Progress Dialog'还是单线实现,一般的应用足矣.
      

  10.   

    To 21bird(世纪菜鸟:sailing) :
      ASSERT错误:
        还有 每次运行的时候都出这个错误:
        Debug Assertion Failed!
        File: wincore.cpp
        line: 883   我看了 wincore.cpp的883行 是这个语句:
       ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||
    (p = pMap->LookupTemporary(m_hWnd)) != NULL);向请教一下大家这是怎么回事?
      

  11.   

    谢谢: jiangsheng(蒋晟.MSMVP2004Jan) :    我看了:http://support.microsoft.com/default.aspx?scid=kb;en-us;147578
        
        这里面说线程里面不能传递mfc 对象, 但是句柄是可以的    是不是说 我在线程里面创建 非模态的对话框的时候 不能将对话框的父窗口指定为 主界面线程的框架对象呢?
        我将父窗口指定为 NULL 则没有错误 
        但是这个对话框 不受控制  还可以操做主界面 不能起到阻塞主界面的作用
      

  12.   

    当然
    你可以用CWnd::FromHandle来创建一个本线程内的句柄对象映射
      

  13.   

    lostiger(傅立叶变换) :
    不好意思,没看全,没看到你上面已经说了我还问:$