io_add_watch回调只会触发一次?

时间:2016-01-14 19:06:39

标签: linux python-3.x named-pipes glib dbus

我有一个命名管道,我想在数据可用时做出反应。我在dbus的上下文中这样做。对于设置,我有以下内容:

mainloop = glib.MainLoop()
fifo = os.open('_notify', os.O_RDWR)
glib.io_add_watch(fifo, glib.IO_IN, notifyLoop, service)
try:
    mainloop.run()
except KeyboardInterrupt:
    mainloop.quit()

所以在第2行和第3行,我打开命名管道,并添加一个手表。我的notifyLoop回调:

def notifyLoop(fifo, cb_cond, service):
    dataStream = service.characteristics[0]
    all = os.read(fifo, 2048)
    print('all', all, 'cb_cond', cb_cond)
    payload, all = all[:20], all[20:]
    while payload:
        newValue = {'Value': [dbus.Byte(x) for x in payload]}
        dataStream.PropertiesChanged(GATT_CHRC_IFACE, newValue, [])
        payload, all = all[:20], all[20:]

基本上,读取管道中的所有内容,然后分成大小为20的块并发出信号。问题是回调只会在第一次触发一次。第一次,我看到了打印,但是当我从另一个程序向管道写入更多数据时,没有任何反应。我误解了io_add_watch的工作方式吗?

这是我用来将两个单独的东西写入命名管道的代码:

user@machine:/Directory# python3
Python 3.4.2 (default, Oct  8 2014, 14:38:51) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> fifo = os.open('_notify', os.O_RDWR)
>>> os.write(fifo, b'\xDE\xAD')
2
>>> os.write(fifo, b'\xBE\xEF')
2
>>> 

第一次写完后,我看到了

all b'\xde\xad' cb_cond <flags G_IO_IN of type GIOCondition>

dbus程序正在运行。但是第二次写的没什么。

2 个答案:

答案 0 :(得分:1)

您的回调必须返回True才能根据pygtk2 reference重新武装。这可以通过显式返回False来生成单个火回调。

此外,这不仅适用于附加GObject.io_add_watch的回调,而且适用于任何GObject回调。

答案 1 :(得分:0)

通过反复试验,我确定我确实需要在每次回调发生结束时执行glib.io_add_watch()以保持重新安装。