繁体   English   中英

C ++ TinyThread和带有FreeGLUT的OpenGL

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM