MFC多线程编程注意事项

时间:2022-09-28 18:31:41

     1.工作线程给主线程发消息使用的是SendMessage和PoseMessage函数。这两个函数的区别在于SendMessage函数是阻塞方式,而PoseMessage函数是非阻塞方式。如果不是严格要求工作线程与主线程必须同步执行,则推荐使用PoseMessage。

     2.不要在线程函数体内操作MFC控件,因为每个线程都有自己的线程模块状态映射表,在一个线程中操作另一个线程中创建的MFC对象,会带来意想不到的问题。更不要在线程函数里,直接调用UpdataData()函数更新用户界面,这会导致程序直接crash。而应该通过发送消息给主线程的方式,在主线程的消息响应函数里操作控件。

     3.在主线程中不要使用WaitForSingleObject和WaitForMultipleObjects两个函数等待线程退出,其原因就是有导致程序死锁的隐患,特别是线程函数里调用了SendMessage或是直接操作了MFC对象,更易出现此种现象。为解决这一问题,微软特提供了一个函数,MsgWaitForMultipleObjects。

      照着网上的例子,写了在主线程中等待单个线程退出的程序:

      DWORD dRet=-2;
      MSG msg;
      BOOL bWaitAll=FALSE; 
      int  nWaitCount=2;    //初始等待的线程数目
      while (1)
      {
        dRet=MsgWaitForMultipleObjects(1,句柄的指             针,bWaitAll,INFINITE,QS_ALLINPUT);
         if (dRet == WAIT_OBJECT_0 + 1)
        {
          TRACE("收到消息,函数返回值为%d /n",dRet);
          while (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
           {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
           }
         }
           else if (dRet == WAIT_OBJECT_0 )
           {
            TRACE("线程退出了/n");
            break;
            }
          }//end while
       }

      实际使用中,在主线程中使用WaitForMultipleObjects导致界面线程在子线程结束前失去响应,而使用MsgWaitForMultipleObjects则很好的解决了这个问题。