是否可以优先处理使用PostMessage
(或任何其他相关方法)发送的消息?
例如, IIRCWM_PAINT
消息仅在队列中没有其他消息时才被处理。是否可以使用自定义消息实现类似的行为?
如果我使用WM_PAINT
特殊参数将自定义消息传递到窗口(我控制 WndProc),它会有类似的行为吗?
是否可以优先处理使用PostMessage
(或任何其他相关方法)发送的消息?
例如, IIRCWM_PAINT
消息仅在队列中没有其他消息时才被处理。是否可以使用自定义消息实现类似的行为?
如果我使用WM_PAINT
特殊参数将自定义消息传递到窗口(我控制 WndProc),它会有类似的行为吗?
我想要一个后台线程来通知主线程该结果可以显示给用户。但是,如果您只是将消息发布到主线程,它将立即得到处理。
这会导致应用程序不响应绘画或用户输入消息,因为我发布的消息始终具有优先权。
我使用的技巧是WM_TIMER
消息的优先级低于WM_PAINT
消息的优先级。
因此,我不会在主窗体上发布消息,而是设置一个计时器。
定时器消息的优先级低于
对于WM_PAINT
窗口代码,DefWndProc
只需设置一个标志,然后仅在下次GetMessage
调用队列为空时检查该标志。一些鼠标消息也被合并(当新消息到达时旧消息被删除)。
真正的答案取决于您实际想要实现的行为。
如果您想避免重入,只需检查一个快速退出标志,例如:
////bool processing = false; // class/window instance variable
...
void HandleCustomMessage()
{
////if (processing)
////{
//// return;
////}
////processing = true;
DoSomething();
////processing = false;
}
如果您想要一个实际的优先级队列,则有许多 PQ 实现。将数据项添加到 PQ,然后发布自定义消息(始终使用相同的 ID)。然后,自定义消息处理程序向 PQ 询问最高优先级的项目。
GetMessage
循环,使用调用来PeekMessage
查看是否有任何事情要做,然后GetMessage
在消息可用时调用,否则检查您的 PQ。您不需要使用这种方法的自定义消息。