关于windows消息循环时消息队列的优先级顺序,参考<windows核心编程》,这是中文版的图示
从GetMessage检查消息的算法中我们可以看到消息的优先级顺序发送消息、登记消息、退出消息、输入消息、重绘消息、定时消息。
我们可以看PAINT消息和SetTimer消息的优先级都是比较低的,所以在程序存在死循环或者无限等待的时候这两个消息容易受到阻塞而无法发送出去得到响应,因而此时我们常用的做法是使用多线程或者使用PeekMessage函数,将do thing 放到else中或者为循环单独开一个线程。
while (TRUE)
{
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break ;
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
else
{
// do thing
}
}