glutTimerFunc阻塞函数有多个变量

时间:2013-02-02 13:43:32

标签: c++ opengl glut

这是我遇到问题的代码的简短版本,它不应该能够编译。

 #include <gl/freeglut.h>

class i{

    //something
}; 

void Keyboard(int value){
/*

*/
    bool key[256];
    if( key['Something'] == true)
    Class.Something ++; 

    glutTimerFunc(33,Keyboard,0);
}

int main(int argc, char **argv){
   Installwindow();


   i Class;

   glutTimerFunc(33,Keyboard,0);


   otheropenglstuff();
}

我遇到的问题是我无法使键盘无效(我上课); 因为那时它会在glutTimerfunc上出错。我也有 glutDisplayFunc(RenderScene)的这个问题;那还有另一种方法吗? 将数据转化为另一个功能而不让它们成为全球性的?我试图解决这个问题 通过使用类,但我在glutTimerFunc上得到另一个错误。

2 个答案:

答案 0 :(得分:1)

  

那么还有另一种方法可以将数据转化为另一种功能,而不必让它们成为全局数据吗?

像其他人已经建议的那样:不要使用GLUT。 GLUT从未被认为是认真应用的基础。这是一个小型框架,适用于小型OpenGL技术演示。您遇到的问题是C和C ++缺少一个名为“闭包”的概念,有时也称为“委托”。其他语言也有它们,实际上当你在这些语言中使用GLUT绑定时,你不会遇到这个问题。

由于C / C ++缺少闭包是如此突出,因此编写了一个小型库(在内部做了疯狂但天才的事情),允许它在C中创建闭包。它被称为 ffcall ,遗憾的是,似乎没有维护,但是作为GNU Common Lisp和Scheme编译器的项目正在使用它。

我写过关于在StackOverflow答案中使用ffcall https://stackoverflow.com/a/8375672/524368https://stackoverflow.com/a/10207698/524368

答案 1 :(得分:0)

你可以使用一个技巧:在将对象转换为int:

之后,将指针作为值传递给对象
i instance;
keyboard((int)&i);

如果需要使用定时器调用该函数,请考虑这样一个事实:当函数结束时,堆栈中的所有对象都被释放。因此,在这种情况下,您应该使用new分配对象,并且在需要解除分配时始终具有句柄。

我知道这很棘手。如果你可以切换到另一个库那么做。