gpt4 book ai didi

c++ - 在没有 WndProc 的情况下运行 win32 事件循环的不同方式的想法?

转载 作者:可可西里 更新时间:2023-11-01 13:28:04 25 4
gpt4 key购买 nike

在纠结多线程、回调、win32 api函数等烦心事的时候,收到了一个idea事件。 (呵呵)

如果我在注册窗口类时为 lpfnWndProc 分配 DefWindowProc 而不是定义全局(或在设计类时是静态的)回调函数,然后在单独的线程上运行整个事件循环?

这样我就不必在 implementing the callback in a class 时绕过 this 问题了。并且主线程继续执行,将您从那个被上帝遗弃的 while 循环中解放出来,让您可以做任何事情,甚至可以打开另一个窗口(耶!)

“正常”方式:

LRESULT CALLBACK WndProc(...)
{
... // process event information
return DefWindowProc(...);
}

int CALLBACK WinMain(...)
{
... // initialize whatever needs initializing :)
WNDCLASSEX wc;
...
wc.lpfnWndProc = WndProc;
... // register the class, create the window, etc...

MSG msg;
while(GetMessage(&msg, 0, 0, 0) != 0)
{
... // TranslateMessage(&msg) if you want/need it
DispatchMessage(&msg); // dispatches the message to WndProc
}

return static_cast<int>(msg.wParam);
}

我新发现的很棒的方法:

DWORD WINAPI MyAwesomeEventLoop(void* data) // must be static in a class
{
... // do whatever you need with the data
MSG msg;
while(GetMessage(&msg, 0, 0, 0) != 0)
{
... // TranslateMessage(&msg) if you want/need it
... // process event information
// call PostQuitMessage(0) to leave the loop
}

return static_cast<DWORD>(msg.wParam);
}

int CALLBACK WndProc(...)
{
...
WNDCLASSEX wc;
...
wc.lpfnWndProc = DefWindowProc;
...
HANDLE threadHandle = 0;
// use "this" as the 4th parameter when implementing in a class
threadHandle = CreateThread(0, 0, MyAwesomeEventLoop, 0, 0, 0);

... // you are now free to do whatever you want! :)

// waits untill the thread finishes
// hopefully because PostQuitMessage(0) was called
WaitForSingleObject(threadHandle, INFINITE);
DWORD returnValue = 0;
GetExitCodeThread(threadHandle, &returnValue);
CloseHandle(threadHandle);
...

return static_cast<int>(returnValue);
}

你们怎么看?

最佳答案

MSDN 上的 GetMessage 文档:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644936(v=vs.85).aspx

阅读第一句:“从调用线程的消息队列中检索消息。”

窗口的消息队列与创建它的线程相关联。由于您在主线程上创建了窗口,因此在新线程上运行的事件循环将不会收到该窗口的任何消息。如果你想在另一个线程上运行事件循环,你需要先创建线程,然后在那个线程上创建你的窗口。

关于c++ - 在没有 WndProc 的情况下运行 win32 事件循环的不同方式的想法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8366577/

25 4 0
文章推荐: windows - 在哪里可以找到 Dart 语言的解释器/编译器?
文章推荐: php - 带有嵌入图表的 Excel.Application 复制表
文章推荐: javascript - 使用 jQuery 偏移来定位
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com