窗口关闭后,流程保持打开状态

时间:2013-10-13 10:36:00

标签: c winapi opengl

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

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

我的猜测是,它可能与此循环有关:<​​/ p>

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/

谷歌也没有给我答案。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您尚未显示实际发布退出邮件的代码,但如果它是一个简单的PostQuitMessage(0);,那么您的问题就在PeekMessage()来电中:

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

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

您应该更改通话NULL以获取第二个参数。

答案 1 :(得分:0)

更改它,而不是while(1)

int continue = 1;

while(continue > 0) 

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

我也会缩短睡眠时间。

答案 2 :(得分:0)

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

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

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

由于我们希望我们的程序是健壮的,即如果它们运行在V-Sync也被禁用的其他用户的计算机上,那么将迭代计数限制在一些合理的数量是有意义的。但这不应该使用硬Sleep来完成。相反,你应该测量dT次迭代之间的时间draw(),如果它小于5ms(即200Hz),你应该在抽奖后添加5 - dT - 1的睡眠。