我在c项目中工作,我将进行一些繁重的物理计算,我希望能够在我完成时查看结果。它现在的工作方式是我在主线程上运行GLUT,并使用一个单独的线程(pthread)来做输入(从终端)和计算。我目前使用glutTimerFunc来做动画,但问题是,无论如何,该函数都会在每次给定时间内触发。我可以通过在动画函数中使用if语句来停止动画,停止变量进行更新,但这会占用大量不必要的资源(我认为)。
为了解决这个问题,我想我可以使用一个带有自定义计时器功能的额外线程,我可以自己控制(没有glutMainLoop弄乱的东西)。目前这是我的测试函数,用于检查这是否有效(意味着函数本身没有完成)。它在glutMainLoop:
之前的单独线程createt中运行void *threadAnimation() {
while (1) {
if (animationRun) {
rotate = rotate+0.00001;
if (rotate>360) {
rotate = rotate-360;
}
glutSetWindow(window);
glutPostRedisplay();
}
}
}
我遇到的具体问题是动画只运行几秒钟,然后停止。有谁知道我怎么解决这个问题?我计划稍后使用计时器等,但我正在寻找的是确保将glutPostRedisplay发送到正确位置的方法。我认为glutSetWindow(窗口)是解决方案,但显然不是。如果我删除glutSetWindow(窗口),动画仍然可以工作,只是不长,但运行速度更快(所以glutSetWindow(窗口)可能会占用大量资源?)
btw变量" window"是这样创建的:
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(854, 540);
glutInitWindowPosition(100, 100);
window = glutCreateWindow("Animation View");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
timerInt = pthread_create(&timerThread, NULL, &threadAnimation, NULL);
glutMainLoop();
我不知道这是否正确,但它编译得很好。任何帮助都很受欢迎!
答案 0 :(得分:0)
这是一个小小的想法,创建包含所有动态设置的类:
class DynamicInfo {
public int vertexCount;
public float *vertexes;
...
DynamicInfo &operator=( const DynamicInfo &origin);
};
主要应用程序将包含那些:
DynamicInfo buffers[2];
int activeBuffer = 0;
在动画线程中只绘制(可能使用一些线程锁定一个变量):
DynamicInfo *current = buffers + activeBuffer; // Or rather use reference
在计算中:
// Store currently used buffer as current (for future manipulation)
DynamicInfo *current = buffers + activeBuffer;
// We finished calculations on activeBuffer[1] so we may propagate it to application
activeBuffer = (activeBuffer + 1)%2;
// Let actual data propagate to current buffer
(*current) = buffers[activeBuffer];
再次锁定一个变量。