这里是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;`
发布于 2012-12-05 09:11:12
随着时间的推移,延迟会变得更糟,这意味着您的事件队列中有许多未触及的事件,这会降低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
}https://stackoverflow.com/questions/13714475
复制相似问题