如何打破xlib的next_event()?

时间:2014-11-23 11:59:07

标签: python pyside xlib qthread

我正在使用QThread(pyside)来处理X11上的全局热键。我有一些简单的while循环,看起来像:

while self.doRun:                
      event=root.display.next_event()
      if event.type==X.KeyPress:
      ....

next_event()因等待实际事件而闻名。那么如何在不等待另一次击键的情况下停止该循环呢?我正在考虑通过Xlib发送带有按键的假事件,但我认为这不是正确的方法。此事件的.terminate()也不是一个选项...与pyside一起崩溃整个应用程序:

  

致命的Python错误:释放

时,此线程状态必须是最新的

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可以发送一个关闭事件(在X11 a destroy event中也许?),以便更明确。另一个想法是检查是否有任何事件先挂起:

if root.display.pending_events():
    event = root.display.next_event()
    # process event

然而,这构成busy-waiting,所以我选择第一个选项。

答案 1 :(得分:0)

这是一个很晚的答案,但我遇到了同样的问题,因此也许对某人还是有帮助的。

基于documentation,您可以使用Python的select module接收超时事件。

使用select的解决方案基本上包括两个步骤:1)处理所有未决事件,以及2)等待 select 调用,直到新的I / O事件到达。如果没有事件到达,则该方法将在一定时间后超时。

这样的事件循环看起来像这样:


# Main loop, handling events
def loop(self):
  self.loop_cond = True
  timeout=5 # timeout in seconds

  while self.loop_cond:
    # handle all available events
    i = self.d.pending_events()
    while i > 0:
      event = self.display.next_event()
      self.handle_event(event)
      i = i - 1

    # Wait for display to send something, or a timeout of one second
    readable, w, e = select.select([self.display], [], [], timeout)

    # if no files are ready to be read, it's an timeout
    if not readable:
      self.handle_timeout()

我用small example创建了要点。