OpenGL 的 Win32 主消息循环
Win32 Main Message Loop for OpenGL
我在 Win32 OpenGL 应用程序中的主要消息循环如下所示:
// Inside wWinMain
bool bQuit = false;
while( bQuit == false )
{
DWORD dwReturn = ::MsgWaitForMultipleObjects( 0, NULL, FALSE, 12, QS_ALLINPUT );
if( dwReturn == WAIT_OBJECT_0 )
{
MSG msg;
BOOL bReturn = ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE );
if( bReturn != FALSE )
{
if( msg.message == WM_QUIT )
bQuit = true;
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
}
if( dwReturn == WAIT_OBJECT_0 || dwReturn == WAIT_TIMEOUT )
{
RenderFrame();
::SwapBuffers( hDc );
}
}
几乎可以正常工作,我只有一个问题:如果我按 Alt+F4 关闭 window,它不会在我释放键后立即退出,但是,如果我将鼠标悬停在window,它立即退出。
A) 这是为什么?我应该如何修改我的循环?
B)我找到的原代码没有使用MsgWaitForMultipleObjects而是连续调用了RenderFrame。我认为这种方式在重绘屏幕上浪费了太多 CPU 时间。我对吗?平常的做法是什么,你是不是把多余的能力都花在画画上了?
你的错误,你只调用 PeekMessage
一次 每个 WAIT_OBJECT_0
但你需要 运行 它在循环 while (::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ))
因为我们可以在这里有几条消息。最好改用 MsgWaitForMultipleObjectsEx
- 试试这个代码:
bool bQuit = false;
while( !bQuit )// for (;;)
{
MSG msg;
switch(::MsgWaitForMultipleObjectsEx( 0, NULL, 12, QS_ALLINPUT, 0))
{
case WAIT_OBJECT_0:
while (::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ))
{
if( msg.message == WM_QUIT )
bQuit = true;// return;
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
case WAIT_TIMEOUT:
RenderFrame();
::SwapBuffers( hDc );
}
}
if I press Alt+F4 to close the window, it does not quit right after I
release the key
当您按 Alt+F4
、MsgWaitForMultipleObjects
return 时,有几条消息发布到您的线程队列,但您处理 并非全部 它而只是一个
however, if I hover the mouse over the window, it quits instantly
新消息 (WM_MOUSEMOVE
) 已放置,但主要 MsgWaitForMultipleObjects
再次 return 并且您最后处理与关闭进程相关的所有消息
我在 Win32 OpenGL 应用程序中的主要消息循环如下所示:
// Inside wWinMain
bool bQuit = false;
while( bQuit == false )
{
DWORD dwReturn = ::MsgWaitForMultipleObjects( 0, NULL, FALSE, 12, QS_ALLINPUT );
if( dwReturn == WAIT_OBJECT_0 )
{
MSG msg;
BOOL bReturn = ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE );
if( bReturn != FALSE )
{
if( msg.message == WM_QUIT )
bQuit = true;
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
}
if( dwReturn == WAIT_OBJECT_0 || dwReturn == WAIT_TIMEOUT )
{
RenderFrame();
::SwapBuffers( hDc );
}
}
几乎可以正常工作,我只有一个问题:如果我按 Alt+F4 关闭 window,它不会在我释放键后立即退出,但是,如果我将鼠标悬停在window,它立即退出。
A) 这是为什么?我应该如何修改我的循环?
B)我找到的原代码没有使用MsgWaitForMultipleObjects而是连续调用了RenderFrame。我认为这种方式在重绘屏幕上浪费了太多 CPU 时间。我对吗?平常的做法是什么,你是不是把多余的能力都花在画画上了?
你的错误,你只调用 PeekMessage
一次 每个 WAIT_OBJECT_0
但你需要 运行 它在循环 while (::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ))
因为我们可以在这里有几条消息。最好改用 MsgWaitForMultipleObjectsEx
- 试试这个代码:
bool bQuit = false;
while( !bQuit )// for (;;)
{
MSG msg;
switch(::MsgWaitForMultipleObjectsEx( 0, NULL, 12, QS_ALLINPUT, 0))
{
case WAIT_OBJECT_0:
while (::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ))
{
if( msg.message == WM_QUIT )
bQuit = true;// return;
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
case WAIT_TIMEOUT:
RenderFrame();
::SwapBuffers( hDc );
}
}
if I press Alt+F4 to close the window, it does not quit right after I release the key
当您按 Alt+F4
、MsgWaitForMultipleObjects
return 时,有几条消息发布到您的线程队列,但您处理 并非全部 它而只是一个
however, if I hover the mouse over the window, it quits instantly
新消息 (WM_MOUSEMOVE
) 已放置,但主要 MsgWaitForMultipleObjects
再次 return 并且您最后处理与关闭进程相关的所有消息