是否有像 Sleep() 这样的 Windows API 函数与 MessageBoxA() 一样工作?

-3 c++ winapi function pause

当我MessageBoxA()在函数中使用时,它会暂停该函数,但主程序仍在运行。当我尝试使用 时Sleep(),它会暂停整个程序,而不仅仅是它所在的函数。为什么会发生这种情况?

是否有一个 Windows API 函数,其工作方式类似于Sleep()但工作方式类似MessageBoxA(),仅暂停其所在的函数,而不是整个程序而不显示对话框?

我尝试使用Sleep(),但想找到另一个像MessageBoxA(). 我也尝试过WaitMessage(),但效果不太好。

Rem*_*eau 5

MessageBoxA()阻塞调用线程,就像Sleep()那样。因此,为了使其自己的对话框窗口正常工作,它在内部运行自己的消息循环,接收和调度 UI 消息。这就是为什么即使调用线程被阻塞,您的主 UI 仍保持响应。

没有Sleep类似的 API 函数可以运行消息循环。您必须自己实施。例如,通过在MsgWaitForMultipleObjects()预期的睡眠间隔持续时间内循环调用。如果它检测到待处理的 UI 消息,请用于PeekMessage()检索消息并DispatchMessage()让 UI 处理它,然后返回等待睡眠间隔中剩余的时间。

例如:

void SleepButHandleMessages(DWORD sleepMs)
{
    while ((sleepMs != 0) &&
           (MsgWaitForMultipleObjects(0, NULL, FALSE, sleepMs, QS_ALLINPUT) == WAIT_OBJECT_0))
    {
        DWORD startTime = GetTickCount();
        MSG msg;
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        if (sleepMs != INFINITE)
            sleepMs -= (GetTickCount() - startTime);
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,更好的解决方案是从一开始就不阻塞 UI 线程。相反,请将任何冗长的操作移至单独的工作线程,该线程会根据需要通知 UI 线程状态更新。