我想知道这两个片段之间是否存在差异:
void main()
{
// ...
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
ExitProcess(0);
}
// ...
void quit()
{
PostQuitMessage(0);
}
Run Code Online (Sandbox Code Playgroud)
bool quit = false;
void main()
{
// ...
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if(quit)
{
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&_msg);
}
ExitProcess(0);
}
}
// Shouldn't get here
ExitProcess(1);
}
// ...
void quit()
{
quit = true;
PostThreadMessage(GetCurrentThreadId(), WM_NULL, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)
抱歉,我无法想出更短的代码段.
我的问题是,调用PostQuitMessage和处理所有消息GetMessage是否等同于处理所有消息PeekMessage,直到它返回FALSE.
根据Raymond的说法,WM_QUIT"仅当消息队列为空时才生成",所以看起来这两种方法应该做同样的事情,但也许有一个微妙的区别.
雷蒙德的博文说:
因为系统试图在"糟糕的时间"不注入WM_QUIT消息; 代替它等待事情产生WM_QUIT消息,从而减少了机会,该程序可能会在由发布的消息的序列引发一个多步骤的过程中之前"安定下来".
所以理论上没有,没有区别,因为系统WM_QUIT在队列为空之前不会生成.然而,Raymond没有说保证消息在WM_QUIT生成之后不会到达,只是系统试图避免消息.
因此,可以想象另一个线程可能会在您退出主GetMessage循环后向您发送消息,并且根据您的应用程序,这可能是您必须处理的事情.例如,如果您在内部发布带有内存分配的消息,接收线程应该释放,那么PeekMessage在线程完全退出之前,您可能需要一个单独的循环来清理它们.
实际上,没有人像你的第二个例子那样编写消息循环.
| 归档时间: |
|
| 查看次数: |
307 次 |
| 最近记录: |