1

我正在尝试创建一个 WIN32 (C++) 程序,在该程序中我必须同时处理消息并运行一个 while 循环。为了做到这一点,我想使用线程。

当我将消息循环移动到一个单独的过程(从函数 WinMain 调用)时,一切正常。但是,当我使用下面的代码线程化该过程时,而不是简单地从主进程调用它,窗口变得无响应。

你知道为什么会这样吗?

在 WinMain 中,创建主窗口后,我删除了消息循环和返回值,添加了以下代码:

std::thread t1(message_loop);
t1.join();
return return_val;

return_val是一个全局变量,我将使用它来接收消息循环结束时 WinMain 应该返回的值。

此外,函数 message_loop 如下:

void message_loop()
{
    MSG messages;
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
    return_val = messages.wParam;
}
4

1 回答 1

4

根本原因是 Windows 有线程消息队列的概念。每个线程都有自己的消息队列。在线程中运行GetMessage是可以的,但它只会为您获取属于该线程的消息,例如您在该线程中创建的窗口。属于任何其他线程的消息(无论该其他线程是如何创建的)在您的线程中都将不可见。

正如您所说,您std::thread仅在“创建主窗口之后”创建。这意味着您有两个线程消息队列;一个来自创建主窗口的主线程,另一个队列为您的std::thread. 后一个队列将保持为空。

您在第二个参数中看到这一点GetMessage- 传递到HWND=0那里意味着“该线程的所有消息”。

In theory, you can have multiple threads for multiple windows, but that quickly gets very complex. So in practice, the most common solution is to use the main thread, and the only reasonable alternative is to have a single dedicated thread.

于 2020-08-27T11:22:49.253 回答