通过windows消息机制在线程间传递消息和事件
2018-01-31 18:04
351 查看
以前经常听一些编程高手说windows是基于消息驱动的,但是一直没有时间研究windows的消息机制。最近有点时间研究了一下windows的消息机制。以前一直以为Windows的消息机制只有在创建窗口的程序中才能使用,其实不然。下面我们来看一个例子:
上面例子一开始创建了2个线程,我们用线程1和线程2来表示。线程1启动以后向线程2发送了2条消息,消息1是一个用户自定义消息,消息2是一条退出消息。线程2 一启动就接收消息,如果接收到用户自定义消息就打印出收到的消息的wParam和lParam变量的值。如果收到退出消息则GetMessage会返回false,线程2退出。此例子没有创建任何一个窗口,但是使用了windows的消息机制来在2个线程之间传递消息和事件。
线程消息队列的创建:系统检测到如果应用程序中的某个线程调用了一个User32.dll模块中的某个函数,会给调用线程分配一个消息队列。然后这个调用线程就能调用GetMessage或者PeekMessage从这个消息队列中获取消息,其他的线程能通过PostThreadMessage函数向这个线程投递消息。
以下是是几篇写的比较好的文章:
windows消息机制传递详解
windows 消息机制、窗口过程与线程间消息传递
windows消息机制 pdf
以前经常听一些编程高手说windows是基于消息驱动的,但是一直没有时间研究windows的消息机制。最近有点时间研究了一下windows的消息机制。以前一直以为Windows的消息机制只有在创建窗口的程序中才能使用,其实不然。下面我们来看一个例子:
#include <windows.h> #include <process.h> #include <math.h> #define UM_SENTTEXT WM_USER+1 unsigned int uID1, uID2; unsigned _stdcall ThreadProc1(void* pArgu) { PostThreadMessage(uID2, UM_SENTTEXT, 1, 2);//向线程2发送一个用户自定义消息 PostThreadMessage(uID2, WM_QUIT, 5,5);//向线程2发送一个退出消息 return 0; } unsigned _stdcall ThreadProc2(void* pArgu) { MSG msg = { 0 }; while (GetMessage(&msg, NULL, 0, 0))//如果 GetMessage 返回 FALSE 表示线程接收到退出消息 { switch (msg.message) { case UM_SENTTEXT://接收到用户自定义消息 printf("消息 w:%d l:%d\n", msg.wParam, msg.lParam); break; default: break; } } return 0; } int main() { _beginthreadex(NULL, 0, ThreadProc1, NULL, 0, &uID1); _beginthreadex(NULL, 0, ThreadProc2, NULL, 0, &uID2); system("pause"); return 0; }
上面例子一开始创建了2个线程,我们用线程1和线程2来表示。线程1启动以后向线程2发送了2条消息,消息1是一个用户自定义消息,消息2是一条退出消息。线程2 一启动就接收消息,如果接收到用户自定义消息就打印出收到的消息的wParam和lParam变量的值。如果收到退出消息则GetMessage会返回false,线程2退出。此例子没有创建任何一个窗口,但是使用了windows的消息机制来在2个线程之间传递消息和事件。
线程消息队列的创建:系统检测到如果应用程序中的某个线程调用了一个User32.dll模块中的某个函数,会给调用线程分配一个消息队列。然后这个调用线程就能调用GetMessage或者PeekMessage从这个消息队列中获取消息,其他的线程能通过PostThreadMessage函数向这个线程投递消息。
以下是是几篇写的比较好的文章:
windows消息机制传递详解
windows 消息机制、窗口过程与线程间消息传递
windows消息机制 pdf
相关文章推荐
- Windows线程(六)使用事件机制解决线程同步问题
- windows 的事件驱动机制和消息循环
- windows 消息机制、窗口过程与线程间消息传递
- 【Android开发】线程与消息处理-Handler消息传递机制之Looper
- Windows消息传递机制
- Qt事件机制浅析(定义,产生,异步事件循环,转发,与信号的区别。感觉QT事件与Delphi的事件一致,而信号则与Windows消息一致)
- ble协议栈cc2540x-1.3.2之通过key处理过程看任务、事件、消息机制
- Android 事件处理模型(三)消息传递机制: Handler Looper MessageQueue
- 线程通信机制:共享内存 VS 消息传递
- Windows事件驱动机制及消息循环
- HandlerThread(子线程也可以有消息传递机制)
- Windows事件驱动机制及消息循环
- 线程通信机制:共享内存 VS 消息传递
- 学习CEGUI亟待解决问题二:消息事件传递机制问题
- 用Windows消息机制解决跨线程添加子控件异常
- liferay6.2通过事件机制实现不同portlet之间数据传递
- 关于 OnCloseQuery: 顺序、不能关机等(所有的windows的广播消息都是逐窗口传递的)——如果一个窗体的OnCloseQuery事件中如果写了代码那么WM_QUERYENDSESSION消息就传不过去了msg.result会返回0,关机事件也就停止了
- 线程通信机制---共享内存:消息传递
- UI线程安全及Handler消息传递机制
- [转载] DELPHI下的WINDOWS消息传递机制