工作线程执行繁重运算时,程序界面用滚动条显示进度?我用了三个线程:
工作线程:运算。结束后SetEvent(hEventFinish),发信号给主线程。
显示线程:DoModal一个派生的CDialog类,上面滚动条动作。
主线程:先后创建上面两个线程一。接收到工作线程发出的信号,使派生CDialog对话框关闭。问题:
1:显示线程只有用CWindThread派生类,并一定要在构造函数里用DoModal出对话框,才能使工作线程工作的同时,显示对话框。还有其它办法吗?
2:当主线程收到工作线程的hEventFinish信号后,如何通知显示线程,让其关闭对话框?谢谢各位!!

解决方案 »

  1.   

    可以用一个菲模态对话框显示状态,在工作(不一定是在另一个线程)中可以用Windows消息(WM_SETTEXT之类)和对话框通讯,并且检查操作是否被取消
      

  2.   

    可以在线程中使用postthreadmessage函数实现线程通讯
    也可以用事件通知
      

  3.   

    to WooSir:
    如何在CWinThread的派生类里接收事件通知和postthreadmessage消息。
    在Run函数里吗?
      

  4.   

    实在搞不定。
    CWinThread派生类哪个函数里执行线程工作?RUN?
    PostThreadMessage(WM_QUIT,0,0)并没有能把CDialog关闭?
    我是在CWindThread构造里DOMODAL出Dialog的。
      

  5.   

    如何在CWinThread的派生类里接收事件通知和postthreadmessage消息。
    在Run函数里吗?
    在Run函数里用getmessage函数获取消息
      

  6.   

    当然在RUN 里面,线程消息循环就在RUN里面
      

  7.   

    shinesi(DaBaiCai) 说的有道理,GetSafeWnd
      

  8.   

    用工作者线程(CreateThread)不好吗?将显示进度的窗口局并传递给工作者线程,用用户自定义消息刷新进度显示。#define UWM_SET_POS (WM_USER+100)处理线程
    DWORD WINAPI ProcThread(LPVOID lpParam)
    {
    HWND hWnd=(HWND)lpParam;
    for(;;)
    {//处理过程
    ::PostMessage(hWnd,UWM_SET_POS,range,pos);
    }
    return 0;
    }显示对话框最好Create出来(非模态对话框),而不要DoModal;
    该对话框中处理消息UWM_SET_POS;
      

  9.   

    为什么要用到三个线程呢?两个不好吗?
    在主线程里显示进度对话框,在工作线程里完成计算!如果主线程受到工作线程的结束信号了,直接关掉对话框就好了嘛!
    至于对话框的显示,可以试试用Create创建再用ShowWindow()来控制它显不显示。
      

  10.   

    用全局变量就搞定。int g_complete=0;
    界面线程设置一个timer(比如间隔1s读这g_complete)换算为进度条百分比显示。工作线程里面写g_complete