gpt4 book ai didi

C++ TinyThread 和带有 FreeGLUT 的 OpenGL

转载 作者:行者123 更新时间:2023-11-28 07:50:37 27 4
gpt4 key购买 nike

我遇到的问题是由于在简单的 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 对象的析构函数不会被叫到。如果我设置了这个回调,那么 delete 运算符出于某种原因会被调用两次,即使 AtExit 函数只被调用一次。

在哪里可以找到这种奇怪行为的根源?

即使我禁用了 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>以获得定义。

关于C++ TinyThread 和带有 FreeGLUT 的 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13881794/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com