#include <windows.h>
#include <stdio.h>
// 声明线程函数
DWORD WINAPI ThreadFunction1(LPVOID lpParameter);
DWORD WINAPI ThreadFunction2(LPVOID lpParameter);
// 定义消息类型
#define WM_SET_MY_VALUE (WM_USER + 1)
#define WM_GET_MY_VALUE (WM_USER + 2)
// 定义全局变量
int myValue = 0;
int main()
{
// 创建第二个线程
HANDLE hThread2 = CreateThread(NULL, 0, ThreadFunction2, NULL, 0, NULL);
if (hThread2 == NULL) {
printf("Failed to create thread2\n");
return 1;
}
// 创建第一个线程
HANDLE hThread1 = CreateThread(NULL, 0, ThreadFunction1, GetThreadId(hThread2), 0, NULL);
if (hThread1 == NULL) {
printf("Failed to create thread1\n");
return 1;
}
// 等待线程退出
WaitForSingleObject(hThread1, INFINITE);
WaitForSingleObject(hThread2, INFINITE);
// 关闭线程句柄
CloseHandle(hThread1);
CloseHandle(hThread2);
return 0;
}
DWORD WINAPI ThreadFunction1(LPVOID lpParameter)
{
// 获取线程ID
DWORD dwThreadID = lpParameter;
// 向第二个线程发送消息设置值
PostThreadMessage(dwThreadID, WM_SET_MY_VALUE, 30, 60);
return 0;
}
DWORD WINAPI ThreadFunction2(LPVOID lpParameter)
{
// 获取线程ID
DWORD dwThreadID = GetCurrentThreadId();
// 向自身发送消息获取值
PostThreadMessage(dwThreadID, WM_GET_MY_VALUE, 0, 0);
BOOL setMsgReceived = FALSE;
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
if (msg.message == WM_GET_MY_VALUE) {
if (setMsgReceived) {
printf("myValue in thread %d is %d\n", dwThreadID, myValue);
break;
}
else {
// wait for WM_SET_MY_VALUE message
PostThreadMessage(dwThreadID, WM_GET_MY_VALUE, 0, 0);
}
}
else if (msg.message == WM_SET_MY_VALUE) {
myValue = msg.lParam;
setMsgReceived = TRUE;
}
}
return 0;
}
这里消息解析全部放在了任务2,任务1中会向任务2发送消息通知更新数据。这样任务2拿到该消息,就同步到改后的数据上,完成了两个进程间的数据同步。
PostThreadMessage有四个参数,
1)第一个就是目的进程的ID,这个例子中在创建第二个进程时用句柄获取其进程ID,并将其传递给第一个进程的创建过程。随后在第一个进程中,使用第二个进程的id,完成向第二个进程发消息的功能。所以这里得先创建进程2,再创建进程1。
2)第二个参数就是消息类别,用于筛选。目的进程收到各种不同类别的消息,可以执行不同的处理,如这里的数据更新,以及数据打印。
3)和4)是可以传递进进程的值,分别是wParam和lParam。不一定都要使用,不用可以默认配0。例子中在myValue = msg.lParam;使用了lParam,所以相当于使用的是60,如果这里改成
myValue = msg.wParam;最后打印的应该是30.
这篇文章展示了如何使用WindowsAPI中的PostThreadMessage函数在两个线程间进行通信。线程1发送WM_SET_MY_VALUE消息给线程2,设置全局变量myValue的值。线程2接收到消息后更新myValue,并通过消息循环等待WM_GET_MY_VALUE消息来打印数据,从而实现了线程间的数据同步。
1616

被折叠的 条评论
为什么被折叠?



