GlutKeyboardFunc回调在openGL中不起作用

时间:2019-11-17 19:31:01

标签: glut

我试图在按openGL中的某个键时退出应用程序,而键盘似乎不起作用。 我也无法仅通过单击窗口的关闭按钮来退出该应用程序。对此行为有何解释? 我也不会连续创建窗口。

这是代码段

void keyboardfunc(unsigned char key, int x, int y) {
cout << "Inside" ;
switch (key) {

case 'q': exit(0);
default: break;

}


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



.
.
.
glutReshapeFunc(reshape_func);


glutDisplayFunc(draw);
glutKeyboardFunc(keyboardfunc);
myinit();

glutMainLoop();


return 0; 
}

该程序通过以下方式模拟插入排序:图形化地表示数组,使用for循环,每次清除屏幕,每次均将数字表示为直方图

只需清除插入排序的模拟即可,只有键盘回调无效。

1 个答案:

答案 0 :(得分:1)

您的绘制函数控制CPU,并且不允许执行GLUT事件循环。考虑到GLUT是单线程的。

您必须注册一个计时器。计时器将产生新的渲染。每秒计算下一次迭代并强制重绘场景。

void draw(){
  renderHistogram();
}

void timer(int value) {
  getNextIteration();
  glutPostRedisplay();
  glutTimerFunc(1000, timer, 1); // executed on a second
}

要注册计时器,请在glutMainLoop之前包括以下行:

glutTimerFunc(1000, timer, 1); // executed on a second

下一个迭代函数将是:

int i = 0, j = 0;
void getNextIteration()
{
    if (i == n) {
        // Array is sorted
        return;
    }

    int key;
    key = arr[i];

    if (j == 0 || arr[j] <= key) {
        // Internal loop finished, reset j, and advance i;
        arr[j + 1] = key;
        i++;
        j = i - 1;
    }

    arr[j + 1] = arr[j];
    j = j - 1;
}