【发布时间】:2015-10-09 03:27:52
【问题描述】:
我正在开发一个 Windows Visual C++ 应用程序,它将监视各种事件的消息泵。这是我的主要 cpp 文件的骨架:
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) {
HWND hwnd;
WNDCLASSEX wincl;
// register WindowProcedure() as message callback function
wincl.lpfnWndProc = WindowProcedure;
// assign other properties...
if (!RegisterClassEx (&wincl))
return 0;
// create main window
hwnd = CreateWindowEx ( ... );
// infinite message loop
while (GetMessage (&messages, NULL, 0, 0)) {
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return 0;
}
这里是回调函数的骨架:
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch(message) {
case WM_CLIPBOARDUPDATE:
// handle the update here
}
}
我的简单问题是回调函数是否保证以顺序开始和结束,或者它们是否可能以并行重叠的方式执行?换句话说,是否有可能对回调函数的 2 个调用可以并行执行,从而可能导致竞争条件?或者 Windows 是否保证每条消息都以串行方式处理,一次一条?欢迎您提供任何文档或参考资料。
【问题讨论】:
-
与您的问题并不真正相关,但您应该从 WinMain 返回 messages.wParam,而不是 0。当您在处理例如 WM_DESTROY 时调用 PostQuitMessage(0) 时,“0”(参数PostQuitMessage) 将是 GetMessage 循环退出后 messages.wParam 的值。
标签: c++ winapi visual-c++ message-queue