[Windows]主线程与子线程之间互发消息并相互响应[含可运行代码]

这是本人今天写的一个关于主线程和子线程交换消息的具体实例。

不仅可以直接运行,也写上了较为详细的注解,希望这对你们有帮助。

注意:线程可以用CreatThread来创建,也可以用更为安全的_beginthreadex创建
在这里的C++只是用于文字输出,如果你习惯于使用C++,也能用C++11标准所支持thread来创建线程。

本文多个实例皆用CreatThread来演示消息传递,但实际使用还请使用_beginthreadex或C++的thread。

主要函数如下:(消息传递需要)
使用GetMessage来获取消息
使用PostThreadMessage来发送线程间消息
使用GetCurrentThreadId来获得当前线程ID

次要函数如下:
使用CreateThread创建线程
使用WaitForSingleObject等待单个线程退出
使用CloseHandle关闭线程句柄

因为WM_USER后面的数可以用来自定义消息,所以本次我就使用了

#define WM_MyMessage (WM_USER+一个数字)

这种形式创建了自己的消息

那么言尽于此,正文开始:

为了循序渐进,我们先来看看单向消息传递的简单例子。

主线程发送消息给子线程的例子如下:

#include <iostream>
#include <Windows.h>
using namespace std;
#define WM_DELOK (WM_USER+2)//自定义了一个消息
DWORD WINAPI ThreadProc1(LPVOID lpRarameter) {//线程函数
	MSG msg;//准备接受消息
	cout << "Thread:I maybe die" << endl;//表示创建好了
	while (GetMessage(&msg, NULL, 0, 0)) {//开始等待消息
		if (msg.message == WM_DELOK) {//如果收到WM_DELOK消息
			cout << "Thread:OK,I die now" << endl;//回复
			return 0;//退出
		}
		Sleep(20);//等待一会
	}
	cout << "Thread:Well,I cannot die..." << endl;//这里被执行到大概是不可能的
	return 0;
}

int main() {
	HANDLE th1;//准备创建线程
	th1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);//创建线程
	Sleep(1000);//稍等一会
	cout << "Main:Yes, you will die" << endl;
	PostThreadMessage(GetThreadId(th1), WM_DELOK, 0, 0);//给线程发送消息
	WaitForSingleObject(th1, INFINITE);//等待线程自然退出
	cout << "Thread is die" << endl;//表示线程成功退出
	CloseHandle(th1);//关闭句柄
	return 0;
}

运行结果图:
在这里插入图片描述

感觉良好,然后是子线程发送消息给主线程的例子:

#include <iostream>
#include <Windows.h>
using namespace std;
#define WM_DELTH (WM_USER+1)//自定义个消息
DWORD WINAPI ThreadProc1(LPVOID lpRarameter) {
	cout << "Thread:I die" << endl;
	PostThreadMessage((*(DWORD*)(lpRarameter)), WM_DELTH, 0, 0);//向主窗口发送自毁消息
	return 0;
}

int main() {
	HANDLE th1;//准备创建线程
	MSG msg;//准备接受消息
	DWORD mainth = GetCurrentThreadId();//使得子线程知道要把消息传到哪里
	th1 = CreateThread(NULL, 0, ThreadProc1, &mainth, 0, NULL);//创建线程,并传递mainth
	while (GetMessage(&msg, NULL, 0, 0)) {//等待消息
		if (msg.message == WM_DELTH) {//获得消息
			cout << "Main:Oh, I get it." << endl;
			break;
		}
		Sleep(20);
	}
	WaitForSingleObject(th1, INFINITE);//等待线程退出
	cout << "Thread is die" << endl;
	CloseHandle(th1);//关闭句柄
	return 0;
}

运行结果图:
在这里插入图片描述

最后是本文的核心,综合上面两个小例子后,得到的复杂点(其实不复杂)的相互多次交换消息例子如下:

#include <iostream>
#include <Windows.h>
using namespace std;
//先自定义三个消息
#define WM_DELTH (WM_USER+1)//线程用这个告知主线程他需要被销毁了
#define WM_DELOK (WM_USER+2)//主线程回复子线程可以被销毁了
#define WM_DELTH_GET (WM_USER+3)//子线程回复主线程它已经销毁
DWORD WINAPI ThreadProc1(LPVOID lpRarameter) {//线程函数
	MSG msg;//准备接收消息
	DWORD th1 = (DWORD)GetCurrentThreadId();//得到当前线程ID
	cout << "Thread:I want to die" << endl;
	PostThreadMessage((*(DWORD*)(lpRarameter)), WM_DELTH, 0, 0);//向主窗口发送想要自毁消息
	while (GetMessage(&msg, NULL,0,0)) {//等待消息
		if (msg.message == WM_DELOK) {//收到允许自毁的消息
			cout << "Thread:OK,I get it" << endl;
			PostThreadMessage((*(DWORD*)(lpRarameter)), WM_DELTH_GET, 0, 0);//向主窗口发送WM_DELTH_GET表示收到消息
			return 0;
		}
		Sleep(20);
	}
	cout << "Thread:But I cannot die..." << endl;//真的不会执行到这里
	return 0;
}

int main() {
	HANDLE th1;//准备创建线程
	MSG msg;//准备接受消息
	DWORD mainth = GetCurrentThreadId();//使得子线程知道要把消息传到哪里
	th1 = CreateThread(NULL, 0, ThreadProc1, &mainth, 0, NULL);//创建线程并传递mainth
	while (GetMessage(&msg, NULL, 0, 0)) {//等待消息
		if (msg.message == WM_DELTH) {//收到WM_DELTH消息
			cout << "Main:I give you die" << endl;
			PostThreadMessage(GetThreadId(th1), WM_DELOK, 0, 0);//收到并回复消息
		}
		else if (msg.message == WM_DELTH_GET) {//收到并退出消息循环
			cout << "Main:Bye" << endl;
			break;
		}
		Sleep(20);
	}
	WaitForSingleObject(th1, INFINITE);//等待线程退出
	cout << "Thread is die" << endl;
	CloseHandle(th1);//关闭句柄
	return 0;
}

最后的运行结果图:
在这里插入图片描述

好的,基本例子到此完毕,相信注解已经帮助大家理解的不错了,要不再看一遍?

好,本文就到此告一段落了,感谢各位的耐心浏览√

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值