Windows 线程间消息通信

使用消息(message)是线程见通信的常用方法之一。Windows也提供了许多函数来实现这一点。主要使用的函数有PostThreadMessage(),  PeekMessage(), GetMessage()

 

发消息:

一般消息都是和窗口(window)联系在一起的。对于没有窗口的线程, windows提供了专门的发消息函数PostThreadMessage()。 该函数把PostMessage()里的窗口句柄参数换成了目标线程ID。线程ID在线程创建过程中可以通过参数传递出来,也可以用GetCurrentThreadId()函数获取当前线程的ID

线程需要接收消息的话需要有个消息队列,默认是不具有消息队列的。在目标线程里使用PeekMessage(&msg,NULL, WM_USER, WM_USER, PM_NOREMOVE) 就可以创建线程消息队列

 

接收消息:

消息接收可以用PeekMessage()和GetMessage()两个函数之一。两个函数的区别是GetMessage()不是立即返回,在接收到消息之前一直等待。PeekMessage()没有消息也会立即返回。这个差别从字面也很好理解,peek是瞅一眼的意思。

 

消息内容

消息内容可以通过PostThreadMessage()后两个参数wParam和lParam来传递。wParam是无符号的,lParam是有符号的,两个参数都可以传递指针。

 

代码范例:

发送消息:

  MSG msg;
  bool status;
  msg.hwnd = NULL;
  msg.message = WM_USER;
  msg.wParam = (WPARAM) _mode;

  if(!PostThreadMessage(mMainThreadID, WM_USER, (WPARAM) _para, NULL))
  {
    TrdDiags::Instance ().diagsPrint (TrdDiags::FLAGS_TIMESTAMP, 0, nullptr, __FUNCTION__, "PostThreadMessage failed!");
    return false;
  }   // end of -- if(!PostThreadMessage(mMainThreadID, WM_USER, (WPARAM) _para, NULL))


在MainThread里接收:

unsigned int runMainThread (void)
{
  MSG msg;
  CUSTOM_TYPE para;
  mMainThreadID = GetCurrentThreadId();
  
  PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);     // create message queue for current thread

  bool running = true;
  
  while (running)
  {
    while (PeekMessage(&msg, NULL,  0, 0, PM_REMOVE)) 
    { 
      switch(msg.message) 
      { 
          case WM_USER:
            mode = (MODES) msg.wParam;
            handleMessage();    //handle messages base on different wParam
            break;
          default:
            break;
      } // end of -- switch(msg.message) 
    }  // end of -- while (PeekMessage(&msg, NULL,  0, 0, PM_REMOVE)) 
  } // end of -- while (running)
  return (0);
}

参考:

http://www.codeproject.com/Articles/225755/PostThreadMessage-Demystified

https://msdn.microsoft.com/en-us/library/windows/desktop/ms644928(v=vs.85).aspx




  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值