通过例子讲解windows下两个task间通过消息,实现变量传递

这篇文章展示了如何使用WindowsAPI中的PostThreadMessage函数在两个线程间进行通信。线程1发送WM_SET_MY_VALUE消息给线程2,设置全局变量myValue的值。线程2接收到消息后更新myValue,并通过消息循环等待WM_GET_MY_VALUE消息来打印数据,从而实现了线程间的数据同步。
#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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值