Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Windows:处理消息的两个线程?_C_Winapi - Fatal编程技术网

C Windows:处理消息的两个线程?

C Windows:处理消息的两个线程?,c,winapi,C,Winapi,我想要两个线程来处理windows消息。一个用于客户端区域中的键/鼠标输入(此线程还负责游戏逻辑),另一个用于其他,因为我正在制作游戏,一些消息会导致DefWindowProc()阻塞(从而冻结游戏) 如何实现这一点?您应该只需要一个线程来处理消息队列,这是Windows已经提供的。如果您正在做任何计算量大的事情,您应该通过使用CreateThread创建一个新线程来将其分派到一个单独的线程。如果您发现自己一直在这样做,那么让该线程永久存在,但在需要时发出信号让它工作。您应该只需要一个线程来处理

我想要两个线程来处理windows消息。一个用于客户端区域中的键/鼠标输入(此线程还负责游戏逻辑),另一个用于其他,因为我正在制作游戏,一些消息会导致DefWindowProc()阻塞(从而冻结游戏)


如何实现这一点?

您应该只需要一个线程来处理消息队列,这是Windows已经提供的。如果您正在做任何计算量大的事情,您应该通过使用CreateThread创建一个新线程来将其分派到一个单独的线程。如果您发现自己一直在这样做,那么让该线程永久存在,但在需要时发出信号让它工作。

您应该只需要一个线程来处理消息队列,这是Windows已经提供的。如果您正在做任何计算量大的事情,您应该通过使用CreateThread创建一个新线程来将其分派到一个单独的线程。如果您发现自己一直在这样做,那么让该线程永久存在,但在需要时发出信号让它工作。

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

然而,一个常见的问题是应用程序执行长时间运行、计算密集型任务以响应特定消息。这样做效果不好,因为当代码在消息处理程序中运行时,应用程序无法处理其他消息(线程一次只能执行一件事情),并且UI变得没有响应

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

可以使用创建其他线程。你可以找到一个样品

在这种情况下,这听起来可能是一个更简单的选择。示例代码:

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);
}
DWORD回调ThreadProc(LPVOID p)
{
HWND HWND=重新解释铸件(p);
对于(int i=0;i<100000;++i)
{
//做任何事
}
返回0;
}
LRESULT回调WindowProc(HWND HWND、UINT uMsg、WPARAM WPARAM、LPARAM LPARAM)
{
开关(uMsg)
{
case WM_KEYDOWN://或任何您想要回复的消息
{
QueueUserWorkItem(ThreadProc、hWnd、WT_EXECUTELONGFUNCTION);
返回0;
}
//处理其他消息。。。
}
返回DefWindowProc(hWnd、uMsg、wParam、lParam);
}

Win32线程池上的必需读取是。

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

然而,一个常见的问题是应用程序执行长时间运行、计算密集型任务以响应特定消息。这样做效果不好,因为当代码在消息处理程序中运行时,应用程序无法处理其他消息(线程一次只能执行一件事情),并且UI变得没有响应

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

可以使用创建其他线程。你可以找到一个样品

在这种情况下,这听起来可能是一个更简单的选择。示例代码:

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);
}
DWORD回调ThreadProc(LPVOID p)
{
HWND HWND=重新解释铸件(p);
对于(int i=0;i<100000;++i)
{
//做任何事
}
返回0;
}
LRESULT回调WindowProc(HWND HWND、UINT uMsg、WPARAM WPARAM、LPARAM LPARAM)
{
开关(uMsg)
{
case WM_KEYDOWN://或任何您想要回复的消息
{
QueueUserWorkItem(ThreadProc、hWnd、WT_EXECUTELONGFUNCTION);
返回0;
}
//处理其他消息。。。
}
返回DefWindowProc(hWnd、uMsg、wParam、lParam);
}

Win32线程池上的必读内容是。

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


对于您的特殊情况,为什么不创建一个具有自己隐藏窗口和消息循环的工作线程呢?每当主窗口接收到您不想在主线程中处理的消息时,将其发布到另一个窗口,它将被工作线程排队处理。

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

对于您的特殊情况,为什么不创建一个具有自己隐藏窗口和消息循环的工作线程呢?每当主窗口接收到您不想在主线程中处理的消息时,将其发布到另一个窗口,它将排队等待并由工作线程处理