PostThreadMessage 使用注意问题

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

  http://blog.csdn.net/shiff/archive/2007/12/05/1918963.aspx

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

  http://wangxiaojs.javaeye.com/blog/294591

   http://topic.csdn.net/u/20080421/10/2bddd696-3262-438f-be9c-6ee830afbb73.html?299673429

PostThreadMessage可以用于线程之间的异步通讯,因为它不用等待调用者返回,
这也许是线程通讯中最简单的一种方法了。

但是要注意以下问题
1 .PostThreadMessage有时会失败,报1444错误(Invalid thread identifier. )
其实这不一定是线程不存在的原因,也有可能是线程不存在消息队列(message queue)造成的。
事实上,并不是每个thread都有message queue,那如何让thread具有呢?
答案是,

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

    http://topic.csdn.net/t/20030627/17/1965978.html 中重载 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 消息可能会丢失 http://blog.csdn.net/yuanmanzheng/archive/2010/04/10/5471487.aspx

5、

原文地址:https://www.cnblogs.com/carl2380/p/1936695.html