2

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;

`

4

1 回答 1

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
    }
于 2012-12-05T01:11:11.600 回答