【问题标题】:Lag using Xlib/X11 event handling in C在 C 中使用 Xlib/X11 事件处理滞后
【发布时间】:2012-12-05 00:37:51
【问题描述】:

这里是 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;
    }
}

然后像这样在 main 中调用它们,

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;

`

【问题讨论】:

  • 没有看到任何关于你的库如何工作的代码/信息,几乎不可能告诉你哪里出了问题......
  • event_waiting 缺少一个紧卷曲。我希望我把它放在正确的位置。如果 KeyPress 和 ButtonPress 都不存在,char wait() 缺少返回值,这是一个 UB 条件。

标签: c events x11 xlib


【解决方案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
    }

【讨论】:

  • 您好,感谢您的回复。我有一个问题。我将如何冲洗它们?我想我必须在 return 0;in event_waiting() 之前添加一些东西,但我不太确定是什么。
  • 再次感谢您的编辑。我按照你的建议做了,但我仍然经历了显着的(虽然可能没有那么大?)滞后。还有其他建议吗?
  • XFlush() 单独可能还不够。如果事件消耗例程需要时间,那么等待事件的数量可能会很高。所以最好也使用XSelectInput() 过滤输入事件。
  • XFlush 只刷新传出队列,不刷新传入 :P
猜你喜欢
  • 2016-07-18
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
相关资源
最近更新 更多