您的位置:首页 > 其它

通过windows消息机制在线程间传递消息和事件

2018-01-31 18:04 351 查看

以前经常听一些编程高手说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消息机制