MFC主UI线程工作和模态对话框
MFC main UI thread workings and modal dialogs
首先让我说,我已经大致搜索了stackoverflow,但无法找到具体的答案。
我的问题是相当理论性的,任何代码的运行都没有问题。请考虑一个简单的MFC应用程序,带有定时器事件和按钮(附加到OnClick事件)。
void SampleDlg::OnTimer(UINT_PTR nIDEvent)
{
CString msg;
msg.Format("time: %lld, tid: %d", (int64_t)time(0), GetCurrentThreadId());
SetWindowText(msg);
}
我的直觉表明,如果我在OnClick事件中睡觉,主UI线程应该挂起,计时器事件不应该踢。
void SampleDlg::OnClick()
{
Sleep(10000);
}
这很好,但是如果我在OnClick中显示一个新的模态对话框,计时器事件仍然发生。这里有什么不同?
void SampleDlg::OnClick()
{
CString msg;
msg.Format("tid: %d is waiting...", GetCurrentThreadId());
::MessageBox(GetSafeHwnd(), msg, "Msg", 0);
// at this point msgbox tells us that thread with tid is waiting
// thread with tid wont reach this line until msgbox is closed
}
编辑:我已经包括了GetCurrentThreadId()
调用,使我想问的更清楚。
当我运行上面的代码时,msgbox和窗口标题给了我相同的线程id: 22012(例如)。我的问题是,当msgbox被显示时,线程22012的PC/IP(程序计数器或指令指针)的值是什么?
与所有模态对话框一样,MessageBox也有自己的消息循环。
所以它使用PeekMessage/GetMessage。WM_TIMER和WM_PAINT消息是消息循环执行时生成的伪消息。这意味着MessageBox内部调用GetMessage或PeekMessage,这导致线程仍然执行MessageBox,但新消息被传递到您的窗口。
相关文章:
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 当对话框被接受时,如何用参数调用槽
- 如何在QT中制作模态QProgressDialog?
- Qt - 创建主窗口前的非模态对话框
- 如何正确使用异常处理IWTH模态对话框
- 如何使用Ifileopendialog打开 *模态 *文件对话框
- 捕获新创建的模态对话框的窗口句柄
- QT在菜单项上显示模态对话框(.UI)单击
- VC6中的多模态对话框
- 如何使非模态对话框始终在应用程序的顶部
- 非模态对话框窗口的良好设计是什么?
- MFC模态对话框的怪异行为
- QT -对话(模态)与子函数
- 如何自动化弹出模态HTML对话框的IE web应用
- 模态对话框继续添加文本
- MFC主UI线程工作和模态对话框
- 非模态对话框和加速器
- 我如何将模态对话框窗口转换为Qt中的非模态对话框窗口
- 如何更新非模态对话框
- 创建不显示的非模态对话框