[英]C++ TinyThread and OpenGL with FreeGLUT
我遇到的问题是由于在简单的FreeGLUT C ++应用程序中可能滥用了线程而产生的。
由于无法轻松完成退出glutMainLoop()
工作,因此我依靠glutLeaveMainLoop()
来完成一些工作,但这实际上并没有将控件还给程序的main
功能。 我有一个全局指针,该全局指针将在GL调用之前在main
函数中设置为指向在堆上创建的对象实例的指针。 在不使用atexit
回调的情况下,没有人会在此实例上调用delete
运算符,尽管我在glutMainLoop
调用之后放置了这样的操作(由于其无效性而被注释)。
这是我正在做的伪代码(由于过滤时间太长,我不会发布实际代码):
CWorld* g_world;
AtExit()
{
delete g_world;
}
void main()
{
atexit(AtExit);
// create an instance of an object that creates a thread in its constructor
// via the new operator and joins this thread in its destructor
// calling the delete operator on that pointer to the thread instance
CWidget thisObjectCreatesATinyThread;
g_world = new CWorld();
...
glutMainLoop();
// delete g_world;
}
请注意,在主函数中,我还包括一个小部件实例,该实例通过在其构造函数中创建的线程进行某些工作。 该线程在其析构函数中加入,然后通过delete
释放内存。
错误的行为 :如果不设置atexit
回调,则会发生资源泄漏,因为不会调用CWorld
对象的析构函数。 如果设置了此回调,则即使由于一次调用AtExit
函数,由于某种原因, delete
运算符也会被调用两次。
在哪里寻找这种奇怪行为的根源?
即使禁用CWidget实例化,我仍然会得到特殊的行为。
我假设您没有使用原始的GLUT库(因为它很古老),而是使用了FreeGLUT,这是最广泛的GLUT实现。 为了使glutMainLoop()返回,您可以执行以下操作:
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);
在调用glutMainLoop()之前。 如果在调用glutLeaveMainLoop()时没有活动的顶级窗口,这将导致它返回。 如果您不关心仍处于活动状态的窗口,请执行以下操作:
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS);
为了获得定义,您可能必须包括<GL/freeglut.h>
而不是<GL/glut.h>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.