我在MFC下编程,主框架(SDI)会创建一个Thread,现在在我的CMainFrame的一个菜单响应函数需要等待这个Thread完成后的结果继续工作,以前我用的等待是Sleep,但是在等待的时候界面就不能更新了,处于不响应状态。有人告诉我是Sleep()倒的鬼。现在应该如何实现同样的功能呢而不影响界面实时更新的实现!

解决方案 »

  1.   

    具体情况大概是:
    static int flag=0;
     Function1()
    {
       ...
       CreateThread() ;  //Run a thread,and it will cost some minutes
       ...
       flag=...
       //一个关于flag的操作
    }
    CMainFrame::OneFunction()
    {
       for(int i=0;i<5;i++)
       {
           Function1(i);
           //需要等到前一个Function结束,才能开始下一个
           Sleep(minutes);
           //wait for the result of "flag"
       }
    }
    请问如何实现之,能够避免界面不能实时更新
      

  2.   

    function1()
    {
    Handle hThread = CreateThread();DWORD dwTimeout = 5000; // in milliseconds
    while ( WaitForSingleObject ( hThread, dwTimeout ) == WAIT_TIMEOUT )
       {
          MSG msg;
          while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
          {
             if (msg.message == WM_QUIT)
             {
               ::PostQuitMessage(nExitCode);
                break;
             }
           if (!AfxGetApp()->PreTranslateMessage(&msg))
             {
                ::TranslateMessage(&msg);
                ::DispatchMessage(&msg);
              }   }}基本是这样。我没有测试随手写的。
      

  3.   

    让线程发消息给frame,再处理这个消息。
      

  4.   

    to: black_fox(咬你耳朵) ,谢谢你的答复先!
    但是我还是没有特别看懂,如果按照你的这个写法,然后Thread()里面是不是还要::PostMessage(WM_RESPOND),然后加上我的这个消息ID的处理函数,就可以了?
      

  5.   

    由于对你的应用不是很清楚。。
    根据你的代码含义,你是要等待一个thread结束后重新启动一个,在flag等于某一个数值的时候进行其他操作而在等待的过程中界面由于不能及时的处理消息而不响应
    我认为的问题是如下两个:
    1、如何等待一个thread德结束  WaitForSingleObject可以实现
      
    2、如何在等待的过程中继续消息循环 通过PeekMessage
    PostMessage(WM_RESPOND)不指到是做什么用的,应该不需要。。因为function1本身必须等待thread结束后才能退出,这个时候界面不会停止相应的。还有其他的方式,比如采用信号量处理,PostMessage方法感觉不是太好。
      

  6.   

    详细描述我的应用问题:做一个物理实验,比如做频率谱,要做好几个频率,比如Freq[5];
    但是对于每一个频率,要先执行一个探点(电压)的工作,比如为了合适这个频率的工作,需要加某一个电压,但是这个电压不是我事先知道的,是根据我的程序的结果得到的!这样,
    Test( )  //我的实验程序
    {
       for(int i=0;i<5;i++)
          BeginFreq(Freq[i]);  //每一个频率的执行
    }
    但是我必须等到前一个频率的实验完成以后,才能继续下一个!否则数据采集就会发生紊乱
    每一个频率的实验涉及到AD/DA部分,需要一定的时间才能完成!
    所以需要等待某个时间(可以计算的到)
    而BeginFreq()包括2个后台的Thread,一个是ADThread,一个是DAThread,
    必须等到AD采集回来后计算到的电压值,分析后看是否满足我的条件,
    if(采集回来的电压值==我的要求)
        继续下一个频率的测量
    else 改变我的DA中的参量,继续采集电压值,直到我的电压值满足要求(即我所说的探点过程)
    但是同时我得需要在界面上实时显示我当前采集回来的数据值(正弦波),
    所以,
    1。如何等待我的线程的完成。应该在哪里加等待语句,加怎样的语句??
    2。如何实现我的数据的实时更新而不是线在的界面无响应! 
      

  7.   

    1  使用PeekMessage()代GetMessage()
    2  使用線程同步技術,如事件,信號量
      

  8.   

    能否这样:
    将Test( )单独最为一个工作进程。
    for(int i=0;i<5;i++){
          BeginFreq(Freq[i]);  //每一个频率的执行
          WaitForMultipleObjects()   //等待那两个AD和DA进程
          PostMessage()       //发消息给主线程,更新界面
    }
      

  9.   

    to:咬你耳朵:
    while ( WaitForSingleObject ( hThread, dwTimeout ) == WAIT_TIMEOUT )
    是什么意思啊,还是应该是
    while ( WaitForSingleObject ( hThread, dwTimeout ) != WAIT_TIMEOUT )
    你的意思是用这个方法在这个等待的过程里继续消息循环?!
      

  10.   

    while ( WaitForSingleObject ( hThread, dwTimeout ) == WAIT_TIMEOUT ) 类似如   WaitForSingleObject ( hThread, INFINITE)   
    只是在等待的过程之间消息不会阻塞
      

  11.   

    如果用MsgWaitForMultipleObjects,在主线程里等待,大致的代码应该怎么写阿?如果用WaitForSingleObject,是不是就应该按照上面的代码来写?
    while ( WaitForSingleObject ( hThread, dwTimeout ) == WAIT_TIMEOUT )
       {
          MSG msg;
          while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
          {
             if (msg.message == WM_QUIT)
             {
               ::PostQuitMessage(nExitCode);
                break;
             }
           if (!AfxGetApp()->PreTranslateMessage(&msg))
             {
                ::TranslateMessage(&msg);
                ::DispatchMessage(&msg);
              }   }