我使用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/
谷歌也没有给我答案。有什么想法吗?
答案 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
的睡眠。