在C中使用Xlib / X11事件处理滞后

时间:2012-12-05 00:37:52

标签: c events x11 xlib

C的初学者用户。

我正在尝试使用X11 / Xlib在C中构建一个库,所以我只能用于小项目,并且在尝试处理事件以获取输入(按下按钮和按键)时遇到问题用户。它运行良好一段时间,然后随着时间的推移开始建立一个显着的滞后。

现在我所拥有的是我的程序检查是否有事件在等待,如果有,则检索它。

我认为我现在的问题是这些事件会被存储在内存中并且会使程序陷入困境。但这只是一个猜测。

任何帮助将不胜感激。谢谢。

编辑:忘记密码(我知道我忘记了一些东西)

有问题的两个功能是:

int event_waiting()
{
    XEvent event;

    if(XCheckMaskEvent(dspy,-1,&event)) {
        if(event.type==KeyPress) {
            XPutBackEvent(dspy,&event);
            return 1;
        } else if (event.type==ButtonPress) {
            XPutBackEvent(dspy,&event);
            return 1;
        }
    } /* <<=== added missing close-curly here */
    return 0;
}

char wait()
{
    XEvent event;
    XNextEvent(dspy,&event);
    if(event.type==KeyPress) {
        saved_x = event.xkey.x;
        saved_y = event.xkey.y;
        return XLookupKeysym(&event.xkey,0);
    } else if(event.type==ButtonPress) {
        saved_x = event.xkey.x;
        saved_y = event.xkey.y;
        return event.xbutton.button;
    }
}

然后他们就像这样被称为主,

if (event_waiting()){
  char c = wait();
  //Switch case goes here
}

编辑2:更新的代码

XEvent event;
if(XCheckMaskEvent(display,-1,&event)) 
{
    if(event.type==KeyPress) {
        XPutBackEvent(display,&event);
        return 1;
    } else if (event.type==ButtonPress) {
        XPutBackEvent(display,&event);
        return 1;
    }
}
XFlush(display);
return 0;

`

1 个答案:

答案 0 :(得分:1)

滞后会随着时间的推移而变得更糟,这意味着您的事件队列中有许多未触及的事件,这会使XCheckMaskEvent()速度变慢。

尝试使用XSelectInput(... ButtonPressMask | KeyPressMask)指定事件,如果没有您感兴趣的事件,请尝试使用XFlush()刷新事件队列:

    if(event.type==KeyPress) {
        XPutBackEvent(dspy,&event);
        return 1;
    } else if (event.type==ButtonPress) {
        XPutBackEvent(dspy,&event);
        return 1;
    } else {
        XFlush(dspy); // this
    }