c++ - 为什么消息框不阻塞线程?

标签 c++ multithreading winapi

<分区>

考虑以下代码片段,其中在 WM_TIMER 消息上显示消息框。

#define IDT_TIMER1 1001

INT_PTR CALLBACK DialogProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch(message) {

        //...

        case WM_INITDIALOG:
        {
            //...

            SetTimer(hWnd, IDT_TIMER1, 1000, (TIMERPROC)NULL);

            break;
        }
        case WM_TIMER:
        {
            int ret = MessageBox(hWnd, L"Cancel operation?", NULL, MB_YESNO);
            if(ret == IDYES) {
                EndDialog(hWnd, 0);
            } else {
                // no-op: keep going
            }

            break;
        }

        //...

        default:
            return FALSE;
    }

    return FALSE;
}

我希望这段代码在初始计时器滴答时显示一个消息框,并阻塞线程直到用户单击按钮。 实际发生的是,在每个计时器滴答时显示一个消息框,即使用户没有点击任何的按钮。

当我检查线程的调用堆栈时,我看到对 DialogProc() 的多次调用,都卡在调用 MessageBox() 的行上(即所有等待用于用户输入)。

鉴于调用堆栈的状态,DialogProc() 怎么可能在MessageBox() 所在的相同 线程中不断被调用> 在上次调用 DialogProc()还没有返回吗?

附言请注意,我不是在询问如何完成所需的行为。我只是在寻找洞察力,以了解导致实际行为的“幕后”情况。

最佳答案

MessageBox 启动一个新的 Message Loop ,除其他事项外,它可以通过正常的 Windows 回调机制访问并调用您的 DialogProc

如果它不这样做,那么像 WM_PAINT 这样的事件将不会得到处理,您的应用程序看起来就像已经死了(消息框除外)。因为计时器仍在运行,所以 WM_TIMER 事件会在适当的时间排队。

关于c++ - 为什么消息框不阻塞线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46890454/

相关文章:

c++ - 使用 Qt 4 在 C++ 中设计模式

c++ - 算术运算的结果如 : 1/3 in C float variable

java - 当我尝试在线程内访问静态方法时,它会抛出 NullPointerException

java - 单例设计模式双重检查锁定

c++ - GetWindowLongPtr 返回失败检索用户数据

c++ - 使用 WSAIoctl 函数统计网络接口(interface)(WIN32 API)

c++ - 如何在 cpp 中为 std::unordered_map<T> 编写自定义 hash_function?

c++ - 替换循环缓冲区/fifo 队列数组元素中的 "FOR()"宏

c++ - 里面注入(inject)的DLL在哪里循环?

c - 多线程 C 应用程序中的访问冲突