win32 - 创建无GUI的消息循环(包含线程窗口的说明)

创建win32窗口需要注册,回调函数一些操作,如果我们不需要窗口的话,可以使用下面代码获得一个仅有消息循环的控制台。

ps: 这样做主要对一些不需要窗口但需要消息循环的程序特别有用,比如蓝牙回调。

#include <Windows.h>
#include <thread>
#include <iostream>
using namespace std;

DWORD threadID{};


void ThreadFunction(HANDLE event_handle)
{
    MSG msg;
    BOOL result;

    threadID = GetCurrentThreadId();
    SetEvent(event_handle);

    for (;;)
    {
        result = GetMessage(&msg, nullptr, 0, 0);

        if (result <= 0)
        {
            break;
        }

        cout << msg.message << " " << msg.wParam << " " << msg.lParam << endl;
    }
}

int main()
{
    HANDLE e = CreateEvent(nullptr, FALSE, FALSE, nullptr);

    thread t(ThreadFunction, e);

    WaitForSingleObject(e, INFINITE);
    CloseHandle(e);


    PostThreadMessage(threadID, WM_APP + 1, 1, 2);
    PostThreadMessage(threadID, WM_APP + 2, 10, 20);
    PostThreadMessage(threadID, WM_QUIT, 10, 20);

    t.join();
    return 0;
}

拓展:

windows应用程序中的一个常见架构是有一个主UI线程(通常这是主线程),它创建并拥有所有UI,并有一个消息循环,为线程创建的所有UI发送消息。如果一个应用程序需要做一些可能会阻止的事情,比如从套接字读取数据,那么通常会使用一个工作线程来实现这个目的:你不希望UI线程阻止(例如,在等待套接字的输入时),因为在这段时间内它不会处理输入,UI最终会没有响应。

如果你有多个UI要同时处理它们的消息的话,那么主线程的消息循环明显不够用,容易造成堵塞。 那么我们就可以编写一个包含多个UI线程的应用程序——每个创建windows的线程都需要自己的消息循环——但这是一种相当先进的技术,对于大多数基本的应用程序来说并不是那么有用。

资料:How does the message loop use threads?

posted @ 2021-03-05 17:49  strive-sun  阅读(626)  评论(0编辑  收藏  举报