在CUI程序中调用GetMessage可以正常使用吗?

可以,调用GetMessage之后该线程转换为GUI线程,有自己的消息队列。

创建一个子线程,然后通过各自的消息队列来实现线程之间消息的传递。

#include "framework.h"
#include <string>
#include <iostream>

#define MSG_USER_OK     1234
#define MSG_USER_EXIT   1235

DWORD WINAPI ThreadFunc(LPVOID);

volatile DWORD g_dwMainTreadId = 0;
volatile DWORD g_dwSubTreadId = 0;

int main()
{
    g_dwMainTreadId = GetCurrentThreadId();
    DWORD dwSubThreadId = 0;
    HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, NULL, 0,&dwSubThreadId);
    if (hThread == NULL)
    {
        std::cout << "子线程创建失败" << std::endl;
        system("pause");
        return 1;
    }
    CloseHandle(hThread);
    g_dwSubTreadId = dwSubThreadId;

    MSG msg = { 0 };
    // 主消息循环:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (msg.message == MSG_USER_OK)
        {
            std::cout << "主线程收到消息:MSG_USER_OK" << std::endl;
            PostThreadMessage(g_dwSubTreadId, MSG_USER_EXIT, 0, 0);
        }
        else if(msg.message == MSG_USER_EXIT)
        {
            std::cout << "主线程收到消息:MSG_USER_EXIT" << std::endl;
            break;
        }
    }

    WaitForSingleObject(hThread, INFINITE);
    std::cout << "子线程被触发(子线程结束)" << std::endl;
    system("pause");
    return 0;
}

DWORD WINAPI ThreadFunc(LPVOID)
{
    Sleep(1000);
    //线个主线程发送一个消息
    while (!PostThreadMessage(g_dwMainTreadId, MSG_USER_OK, 0, 0))
    {
        Sleep(1000);
    }

    MSG msg = { 0 };

    // 主消息循环:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        //收到主线程发过来的消息之后推出
        if (msg.message == MSG_USER_EXIT)
        {
            std::cout << "子线程收到消息:MSG_USER_EXIT" << std::endl;
            PostThreadMessage(g_dwMainTreadId, MSG_USER_EXIT, 0, 0);
            break;
        }
    }

    return 0;
}

framework.h中的内容:

#include "targetver.h"
#define WIN32_LEAN_AND_MEAN             // 从 Windows 头文件中排除极少使用的内容
// Windows 头文件
#include <windows.h>
// C 运行时头文件
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>

运行结果:

123

发布了7 篇原创文章 · 获赞 1 · 访问量 259

猜你喜欢

转载自blog.csdn.net/lk_HIT/article/details/104206098