繁体   English   中英

Windows:两个线程处理消息?

[英]Windows: two threads handling messages?

我想有两个线程来处理Windows消息。 一个用于客户端区域中的键/鼠标输入(此线程也处理游戏逻辑),另一个用于其余部分,因为我正在制作游戏,并且某些消息导致DefWindowProc()阻塞(从而冻结了游戏)。

我该如何实现?

与Cody所写的相反,您绝对可以处理来自多个线程的消息。 但是,这不是可定制的所有人免费。 而是,窗口具有线程关联性:每个线程将接收发送或发布到该线程创建的窗口的消息。 无法将任何窗口的消息传递到任何其他线程。

对于您的特定情况,为什么不创建带有自己的隐藏窗口和消息循环的辅助线程? 只要主窗口在主线程中收到您不想处理的消息,然后将其发布到另一个窗口,它将被排队到工作线程并由工作线程处理。

您只需要一个线程即可处理消息队列,这是Windows已经提供的。 如果您要执行任何计算量大的工作,则应使用CreateThread创建一个新线程,将其分派到单独的线程中。 如果发现自己一直在执行此操作,则将该线程永久保留在那里,但在需要时发出信号通知它可以工作。

不,所有消息都需要在单个线程上进行处理。 该单个线程通常称为UI线程,因为它是控制用户界面的线程。 尝试在非UI线程上处理UI消息只会给您带来麻烦。

但是,常见的问题是响应特定消息执行长时间运行且计算量大的任务的应用程序。 这不能很好地解决,因为当代码在消息处理程序内部运行时,应用程序无法处理其他消息(线程一次只能执行一件事),并且UI变得无响应。

解决方案是剥离另一个线程(或您需要的两个或多个线程),并将长时间运行且计算量大的任务委托给该线程。 您仍将在单个UI线程上处理消息,但是在消息处理程序内部,您将把任务传递给帮助程序线程。 您会经常听到这种被称为“工作线程”或“后台线程”模式的消息。

您可以使用CreateThread函数创建其他线程。 您可以在此处找到示例。

在这种情况下,听起来QueueUserWorkItem函数可能是一个更简单的选项。 样例代码:

DWORD CALLBACK ThreadProc(LPVOID p)
{
    HWND hWnd = reinterpret_cast<HWND>(p);

    for (int i = 0; i < 100000; ++i)
    {
        // do whatever
    }

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_KEYDOWN: // or whatever message you want to respond to
        {
            QueueUserWorkItem(ThreadProc, hWnd, WT_EXECUTELONGFUNCTION);
            return 0;
        }
        // process other messages...
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

有关Win32线程池的必读内容在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM