【发布时间】:2017-10-23 13:22:11
【问题描述】:
考虑下面的代码 sn-p,在 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() 怎么可能一直在 same 线程中被调用,而 MessageBox() 在尚未返回最后一次打电话给DialogProc()?
附:请注意,我不是在问如何完成所需的行为。我只是在寻找洞察力,以了解导致实际行为的“幕后”发生了什么。
【问题讨论】:
标签: c++ multithreading winapi