大家好。我有一个程序,要执行8个步骤,每个步骤的执行时间都比较长,于是我就设计了一个非模式的提示对话框显示这8个步骤的信息,每个步骤信息前都有一个勾号图标,程序刚执行时,所有的勾号图标都是隐藏的,每当执行完一个步骤,就显示相应步骤信息前的勾号,这样就可以提示当前执行到哪个步骤了。但是程序在正式运行时,一旦开始执行这8个步骤的计算后,非模式对话框就无法显示每个步骤的信息和步骤前的勾号了,好像程序死掉了一样,我知道这是因为单线程在大量计算时无法响应对话框的消息的缘故,于是我考虑将这8个步骤的计算放到多线程里完成,主线程只显示对话框,由于是初次接触多线程编程,看了很多文章,但是还有一些不明白,自己也有一点想法,只是不知道这种想法是否可行,想请教各位。
1、我考虑依次分别开8个工作者线程来执行每一个步骤,一个步骤执行完,则对应的线程函数返回,这样,只要取得线程函数的返回值为真,我就可以在相应步骤前加上勾号,否则,如果线程函数返回值为假,就退出非模式对话框并中止后续步骤的计算,但是,这需要在主线程中调用WaitForSingleObject函数来等待子线程的函数返回,而WaitForSingleObject函数会使主线程挂起,这样不就造成了主线程暂时停止响应吗?那样主线程创建的非模式对话框也会停止响应吧,这和单线程的情形不是一样了么?很困惑,不知该怎么办……
2、如果不开8个工作者线程,而是把8个计算步骤合并到一个线程中完成,那么子线程每完成一个步骤就需要挂起,然后等主线程创建的非模式对话框显示了一个勾号后再接着执行,这个貌似比较复杂,不知道该怎么去实现呢?请指导一下。在此先谢谢各位了。

解决方案 »

  1.   

    你的问题不是"因为单线程在大量计算时无法响应对话框的消息的缘故",而是你的主线程在做你那8个步骤,而没有响应窗口消息.如果你只是想显示几个勾号,可以在你的8个步骤里SendMesage到非模式对话框上,让它重绘一下窗口.1. 没有必要8个线程.2. 在一个线程的情况下,如果你非要显示完一个勾号以后,再接着执行(为什么呢?),可以用一个信号量,一个步骤做完后,调用SendMessage到非模式对话框,对话框那边获取信号量,返回消息处理函数.干活的线程这边wait信号量,这样它就不往下跑了.对话框的主线程那边,画完了勾号以后,释放信号量,干活的线程继续做下一个步骤..
      

  2.   

    postmessage()在线程向主线程发送消息就行
      

  3.   

    #if THREAD_LOOP_ALL_DEVICE_ENABLE
    g_bLoopAllDeviceEnable = FALSE;
    while(TRUE)
    {
    DWORD result ; 
    MSG msg ; 

    result = MsgWaitForMultipleObjects(1, &(g_pThreadLoopAllDevice->m_hThread), 
    FALSE, INFINITE, QS_ALLINPUT); 

    if (result == (WAIT_OBJECT_0)){
    break;

    else 

    PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
    DispatchMessage(&msg); 
    }
    }
    delete g_pThreadLoopAllDevice;//删除线程
    #endif用这种方式去结束你的线程
      

  4.   

    问题貌似解决了,按照大家提供的方法,主线程开子线程,然后计算过程中子线程向主线程PostMessage来控制非模态对话框的显示、销毁和画勾号。
      

  5.   

    本贴结了,遇到了一个新问题,请不吝指教。
    http://topic.csdn.net/u/20091126/10/370c1bfe-111f-489a-8d91-91aed0c1f064.html?22083