【发布时间】:2012-04-03 00:30:57
【问题描述】:
通常的 WinAPI 消息循环如下所示:
MSG msg;
while (GetMessage(&msg, hwnd, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
是否允许不调用 DispatchMessage() 而是自己处理消息?如果不是,我该如何在避免全局变量和线程问题的同时很好地处理这种行为?
编辑: 我基本上想使用我自己的回调函数,它没有 WndProc 签名。但是我想不出在不使用静态或全局变量的情况下从 WndProc 中调用该函数的方法。 [这需要锁定,我认为这不是您可以使用可能非常频繁调用的回调函数所做的最好的事情。]
感谢您的帮助。
【问题讨论】:
-
avoiding global variables and thread problems你能解释一下你的意思吗? -
@Jesse:我希望他指的是与使用非 const 且由多个线程访问的全局变量相关的常见问题。每个使用它们的线程都必须使用锁定机制来访问它们。
-
@Jesse 已编辑。希望现在好多了。
-
只有多线程才需要加锁;上面的代码有一个线程:对给定线程拥有的 WndProc 的每次调用都在线程返回循环并处理下一条消息之前完全完成,因此您不必在这里处理并发问题。通常,Win32 UI 是使用单个线程编写的,用于通过单个消息循环来管理 UI,因此您只需处理使用 附加 线程进行后台工作的锁定。
-
只是一个小扳手,但并非所有内容都通过消息循环。
SendMessage()来自同一个线程(至少)直接转到WndProc()。