【问题标题】:XPeekEvent Function is BlockingXPeekEvent 函数被阻塞
【发布时间】:2016-10-03 11:11:33
【问题描述】:

我有一个具有以下基本结构的程序:

while( true )
{
    if(event.type==EVENT_KEY_RELEASE  || event.type==EVENT_KEY_PRESS){
     XEvent xev;    
    XPeekEvent(display, &xev);
        if (XFilterEvent(&xev, G.win)) { printf("XFilterEvent: true\r\n"); }
        else
        {
            if(xev.type == KeyRelease || xev.type == KeyPress)
              // Get keyboard character
         }

}

我遇到的问题是,当我按下并释放键盘键时,它会阻塞事件队列,直到我按下另一个键(或任何其他事件,如鼠标移动和......),理想情况下我想要一个 X 功能检查事件但根本不阻塞?

更新: 我更改了我的程序并删除了无限循环,而不是我尝试在计时器踏板中执行此操作,并且我每 30 毫秒调用一次此部分,但我遇到了问题。

【问题讨论】:

  • 当您调用XPeekEvent 时,是什么让您确定事件队列不为空?如果它为空,则XPeekEvent 将阻塞,直到有事件可用。
  • 如果你想要一个非阻塞的“队列中是否有 y 类型的事件”函数,请参考XCheckTypedEvent。但是,我在您提供的有限代码中看到的是,您似乎是在与 X 战斗而不是 使用它(这意味着您可能应该重新考虑您的方法并告诉我们你真正想做的事)

标签: c++ ubuntu-14.04 x11 xlib


【解决方案1】:

XPeekEvent 查看事件而不将其从队列中删除。因此,如果在队列的前面有一个奇怪的事件,并且您在无限循环中调用 XPeekEvent,它会重复读取该事件,但无法处理它,因此程序会锁定。

【讨论】:

    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多