【发布时间】:2013-12-13 22:23:51
【问题描述】:
我已通过以下方式注册回调:
SetWindowLongW(hWindow, GWL_WNDPROC, (LONG)WindowCallback);
我在那里毫无问题地接收消息。我在回调中有 if() 样式代码,如下所示:
if (MSG == 1)
{
*boolptr = true;
...
} else if(MSG == 2) {
if (*boolptr == true)
return;
// do stuff
}
变量是这样定义的(全局,在#includes right..下)
volatile bool boolVar = false; volatile bool* volatile boolptr = &boolVar;
如果我在 main() 中等待 *boolptr 为 TRUE,一切都很好,但如果我在应该更改的同一个回调中等待它,它就不起作用。显然我不明白这里的一些概念,所以我寻求帮助或解释为什么它不起作用。
值为 2 的 MSG 总是先到达,然后在处理一些值为 1 的 MSG 之后。一段时间后会发生同样的事情,但我不想做同样的处理并浪费 CPU 周期,因此我需要知道 MSG 是否[1] 正在关注它并返回。希望你能理解我。
谢谢!
【问题讨论】:
-
您的问题有点令人困惑——您所说的“等待”是什么意思?您列出的代码没有在标志上等待。但是,如果您的“等待”类似于 while (*boolptr) Sleep(1000);那么您的 WndProc 将不会查看 MSG(1),除非您在循环中使用 DoEvents。另一个原因可能是 MSG(2) 从未被解雇。
-
考虑消除 bool 和 bool* 变量。而是使用 PreviousMSG 变量。这应该让您只用一个 if 语句来检查感兴趣的条件。
-
@Codism,我需要等待,因为第一次运行我需要处理 MSG[2] 部分中的代码,所以我等待几秒钟期待 MSG[1],如果没有收到我做MSG[2] 中的处理。但是,如果我确实收到了它并且我知道我收到了(我设置了消息框),我就无法捕获该布尔值。希望你现在明白了。
-
@ScottMcP-MVP,MSDN 上有什么参考资料吗?如果答案正确,我可以将其设置为一个。
-
MSDN 不相关 - 它只是带有您创建的变量的程序逻辑。 if(MSG == 2 && PreviousMSG == 1) { PreviousMSG = 2; return;} 如果这是您要检测的情况。
标签: c++ c windows multithreading callback