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



以前经常听一些编程高手说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函数向这个线程投递消息。

以下是是几篇写的比较好的文章:

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值