gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:53:38 27 4
gpt4 key购买 nike

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

`

最佳答案

延迟会随着时间的推移变得更糟,这意味着您的事件队列中有许多未触及的事件,这会减慢 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
}

关于c - 在 C 中使用 Xlib/X11 事件处理时滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13714475/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com