io_add_watch 回调只触发一次?
io_add_watch callback only fires once?
我有一个命名管道,我想在数据可用时对其做出反应。我在 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 程序是 运行。但是第二次写什么都没有。
通过反复试验,我确定我确实需要在每次回调结束时执行 glib.io_add_watch()
以继续重新启动它。
您的回调必须 return True
才能根据 pygtk2 reference 重新布防。这可用于通过显式 returning False
.
进行单次触发回调
此外,这不仅适用于附加了 GObject.io_add_watch
的回调,还适用于任何 GObject 回调。
我有一个命名管道,我想在数据可用时对其做出反应。我在 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 程序是 运行。但是第二次写什么都没有。
通过反复试验,我确定我确实需要在每次回调结束时执行 glib.io_add_watch()
以继续重新启动它。
您的回调必须 return True
才能根据 pygtk2 reference 重新布防。这可用于通过显式 returning False
.
此外,这不仅适用于附加了 GObject.io_add_watch
的回调,还适用于任何 GObject 回调。