使用`PostQuitMessage`和处理所有消息之间有区别吗?

Pau*_*aul 1 c windows winapi

我想知道这两个片段之间是否存在差异:

一:

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"仅当消息队列为空时才生成",所以看起来这两种方法应该做同样的事情,但也许有一个微妙的区别.

Jon*_*ter 6

雷蒙德的博文说:

因为系统试图在"糟糕的时间"不注入WM_QUIT消息; 代替它等待事情产生WM_QUIT消息,从而减少了机会,该程序可能会在由发布的消息的序列引发一个多步骤的过程中之前"安定下来".

所以理论上没有,没有区别,因为系统WM_QUIT在队列为空之前不会生成.然而,Raymond没有说保证消息在WM_QUIT生成之后不会到达,只是系统试图避免消息.

因此,可以想象另一个线程可能会在您退出主GetMessage循环后向您发送消息,并且根据您的应用程序,这可能是您必须处理的事情.例如,如果您在内部发布带有内存分配的消息,接收线程应该释放,那么PeekMessage在线程完全退出之前,您可能需要一个单独的循环来清理它们.

实际上,没有人像你的第二个例子那样编写消息循环.