可以,调用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>
运行结果: