• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
张纯睿
博客园    首页    新随笔    联系   管理    订阅  订阅

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、

posted @ 2011-01-16 14:59  张纯睿  阅读(828)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3