多线程间消息通讯

Posted liu6666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程间消息通讯相关的知识,希望对你有一定的参考价值。

技术图片

 

 

 

自定义windows消息

#define MY_MSG  (WM_USER+1)

//为了防止用户自定义消息ID与系统消息ID冲突,用户只能定义WM_USER(0x0400)以后的ID使用

 

 

 

PostThreadMessage    将一个队列消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回

BOOL PostThreadMessage(
DWORD   idThread, //接收消息的线程标识符  
UINT     Msg,     //指定被寄送的消息
WPARAM   wParam,  /附加的消息特定信息
LPARAM   IParam  //附加的消息特定信息
);
//线程没有消息队列,此函数将失败

 

目标线程通过GetMessage()方法来接收消息,若无消息则阻塞

BOOL GetMessage(
LPMSG lpMsg,  //接收消息的线程ID
HWND hWnd,    //取得消息的窗口的句柄,为NULL时获取所属线程的消息
UINT wMsgFilterMin,//指定被检索的最小消息值的整数。
UINT wMsgFilterMax  //指定被检索的最大消息值的整数
);

 

 

PeekMessage 为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构(窥探消息队列中的消息)

BOOL PeekMessage(
LPMSG IpMsg,     //接收消息的线程ID
HWND hWnd,       //取得消息的窗口句柄,为NULL时获取所属线程的消息
UINT wMSGfilterMin,//指定被检索的最小消息值的整数
UINT wMsgFilterMax,//指定被检索的最大消息值的整数
UINT wRemoveMsg   
);
wRemoveMsg   可取下列值
PM_NOREMOVE PeekMessage处理后,消息不从队列里除掉。
PM_REMOVE PeekMessage处理后,消息从队列里除掉。
PM_NOYIELD 此标志使系统不释放等待调用程序空闲的线程。可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE
技术图片

 

 

 

以上是关于多线程间消息通讯的主要内容,如果未能解决你的问题,请参考以下文章

多线程间的通讯之等待唤醒机制

rt_thread线程间通讯

JAVA 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)

使用线程间通信之条件变量

Android-Android进程间通讯之messenger

优化技术专题「线程间的高性能消息框架」再次细节领略Disruptor的底层原理和优势分析