C Windows:处理消息的两个线程?
我想要两个线程来处理windows消息。一个用于客户端区域中的键/鼠标输入(此线程还负责游戏逻辑),另一个用于其他,因为我正在制作游戏,一些消息会导致DefWindowProc()阻塞(从而冻结游戏)C Windows:处理消息的两个线程?,c,winapi,C,Winapi,我想要两个线程来处理windows消息。一个用于客户端区域中的键/鼠标输入(此线程还负责游戏逻辑),另一个用于其他,因为我正在制作游戏,一些消息会导致DefWindowProc()阻塞(从而冻结游戏) 如何实现这一点?您应该只需要一个线程来处理消息队列,这是Windows已经提供的。如果您正在做任何计算量大的事情,您应该通过使用CreateThread创建一个新线程来将其分派到一个单独的线程。如果您发现自己一直在这样做,那么让该线程永久存在,但在需要时发出信号让它工作。您应该只需要一个线程来处理
如何实现这一点?您应该只需要一个线程来处理消息队列,这是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的消息。无法将任何窗口的消息传递到任何其他线程 对于您的特殊情况,为什么不创建一个具有自己隐藏窗口和消息循环的工作线程呢?每当主窗口接收到您不想在主线程中处理的消息时,将其发布到另一个窗口,它将排队等待并由工作线程处理