使用PostThreadMessage 与线程进行大数据量的通讯

​ ​

 

使用PostThreadMessage在Win32线程间传递消息

 PostThreadMessage可以用于线程之间的异步通讯,因为它不用等待调用者返回,

这也许是线程通讯中最简单的一种方法了。


但是要注意以下问题

1 .PostThreadMessage有时会失败,报1444错误(Invalid thread identifier. )

其实这不一定是线程不存在的原因,也有可能是线程不存在消息队列(message queue)造成的。

事实上,并不是每个thread都有message queue,那如何让thread具有呢?

答案是,

   a、至少调用message相关的function一次,比如GetMessage,PeekMessage。

   中重载 CWinThread::Run()

int CGraphThread::Run()

{

 // TODO: ÔÚ´ËÌí¼ÓרÓôúÂëºÍ/»òµ÷ÓûùÀà

 MSG   stMsg;

 while(1)

 {

  MsgWaitForMultipleObjects(  0,  

         NULL,  

         FALSE,  

         INFINITE,

         QS_ALLINPUT   );

  while (::PeekMessage(&stMsg,   NULL,   NULL,   NULL,   PM_REMOVE))

  {

   switch   (stMsg.message)

   {

   case   TM_EXIT:

    this-> OnExit(stMsg.wParam, stMsg.lParam);

    break;

   case   TM_OPEN:

    this-> OnOpen(stMsg.wParam, stMsg.lParam);

    break;

   case   TM_CLOSE:

    this-> OnClose(stMsg.wParam, stMsg.lParam);

    break;

   case   WM_QUIT:

    return   0;

   }

   //TRACE( "My   Thread   is   alive,   ln=%u\n ",   __LINE__);

   //Sleep(THREAD_SLEEP_TIME);

  }

 }

 return CWinThread::Run();

}

    b、也可以循环调用直至返回值>0(此种方法不一定有效)

2.如果是post动态分配的memory给另外一个thread,要注意内存的正确释放。

3.PostThreadMessage不能够post WM_COPYDATE之类的同步消息,否则会报错

4.最好不要使用PostThreadMessage post message给一个窗口,使用PostMessage替代。

   这一点详见 多线程:PostThreadMessage 消息可能会丢失