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?

原文链接: https://www.cnblogs.com/strive-sun/p/14487576.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

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

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/404663

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月25日 下午4:40
下一篇 2023年4月25日 下午4:40

相关推荐