是否可以优先处理使用PostMessage
(或任何其他相关方法)发送的邮件?
WM_PAINT
消息。是否可以使用自定义消息实现类似的行为?
如果我使用带有特殊参数的WM_PAINT
来向窗口传递自定义消息(我控制WndProc)它会有类似的行为吗?
答案 0 :(得分:2)
我想要一个后台线程来通知主要结果可以显示给用户。但是,如果您只是将消息发布到主线程,它将立即得到处理。
这会导致应用程序无法响应绘制或用户输入消息,因为我发布的消息始终优先。
我使用的技巧是WM_TIMER
消息的优先级低于WM_PAINT
消息。
因此,我不会在主表单上发布消息,而是设置计时器。
定时器消息的优先级低于
答案 1 :(得分:1)
对于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。使用此方法不需要自定义消息。