0

我在使用 winapi 时遇到问题,或者无论如何我都在猜测。当我关闭应用程序时,该过程仍然保持为“幽灵”。窗口像往常一样消失,但进程仍然存在,这阻止了我重新编译。我必须从任务管理器中手动杀死它。

我不知道代码的哪一部分是错误的,而且有点冗长,所以这里是完整代码的链接:http: //pastebin.com/TmRiCeR4

不过我的猜测是,它可能与这个循环有关:

while(1) {
                if(PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) {
                        if(msg.message == WM_QUIT) {
                                break;
                        }

                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                } else
                        draw();

                Sleep(100);   //crappy way of stopping 10000000000000 loops a second

        }

我猜它没有正确地“转义”循环,所以它永远不会在它之后到达 closewindow() 函数,但我可能是错的。我从教程中部分复制了代码,虽然我确实更改了它,所以我看不出教程代码中的问题是什么。这是我正在谈论的教程(可能已经过时?):http ://bobobobo.wordpress.com/2008/02/11/opengl-in-a-proper-windows-app-no-glut/

谷歌也没有给我答案。有任何想法吗?

4

3 回答 3

1

您尚未显示实际发布退出消息的代码,但如果它很简单,PostQuitMessage(0);那么您的问题就出在您的PeekMessage()电话中:

 if(PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE))

通过提供窗口过滤器 ( hwnd),您可以防止PeekMessage()检索任何已发布的线程消息(即,消息不是发送到窗口,而是发送到线程)。由于PostQuitMessage()发布线程消息,您的循环将永远不会检索它,因此永远不会退出。

您应该更改调用以传递NULL第二个参数。

于 2013-10-13T12:58:17.000 回答
0

改变它,而不是 while(1)

int continue = 1;

while(continue > 0) 

if(msg.message == WM_QUIT) {
                           continue = 0;
                           break;
                           }

我也会缩短睡眠时间。

于 2013-10-13T10:39:01.207 回答
0

当窗口关闭时WM_CLOSE,会生成一条消息,您通常在窗口类的消息函数中处理该消息。通常的反应是调用PostQuitMessage它将发送WM_QUIT一条消息。在您测试的主应用程序循环中WM_QUIT,当该消息到达时,您将执行所有必要的关闭并跳出循环或调用ExitProcess

如果没有空闲处理要做,而不是在PeekMessage你应该使用之后GetMessage休眠,它会在内部休眠直到下一条消息到达。但是,OpenGL 动画循环有资格作为空闲处理,因此您不能这样做。

但是,如果您的绘图调用每秒迭代一百万次,您就会遇到另一个问题:即您的图形驱动程序中没有启用垂直回扫同步 (V-Sync)。启用它!

因为我们希望我们的程序是健壮的,即如果它们在另一个用户的计算机上运行,​​而 V-Sync 也被禁用,那么将迭代次数限制在某个合理的数字是有意义的。不过,这不应该使用硬来完成Sleep。相反,您应该测量迭代dT之间的时间draw(),如果它小于 5 毫秒(即 200Hz),您应该5 - dT - 1在绘制之后添加一个睡眠时间。

于 2013-10-13T11:01:06.340 回答