【发布时间】:2015-08-10 01:09:15
【问题描述】:
首先让我说我已经粗略搜索了stackoverflow,但找不到具体答案。
我的问题是理论上的,任何代码的运行都没有问题。请考虑一个带有计时器事件和按钮(附加到 OnClick 事件)的简单 MFC 应用程序。
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(程序计数器或指令指针)的值是多少?
【问题讨论】:
-
@RogerRowland 感谢您的链接,是的,这是问题,但我无法使用搜索找到它。也许我不知道其他人会如何表达这个问题:/