2016-01-14 3 views
1

У меня есть именованный канал, на который я хочу реагировать, когда доступны данные. Я делаю это в контексте dbus. Для установки, у меня есть следующие:io_add_watch callback срабатывает только один раз?

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?

Вот код, который я использовал, чтобы написать две отдельные вещи, названной трубы:

[email protected]:/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 работает. Но ничего для второго не пишут.

ответ

1

Обратный звонок должен быть возвращен True для повторного вооружения в соответствии с pygtk2 reference. Это можно использовать для создания обратных вызовов одного огня, явно возвращая False.

Кроме того, это не только обратные вызовы, связанные с GObject.io_add_watch, но и для любого обратного вызова GObject.

0

Пройдя проб и ошибок, я решил, что мне действительно нужно выполнить glib.io_add_watch() в конце каждого события обратного вызова, чтобы сохранить его.

+0

Принятый ответ проще. – antoyo

Смежные вопросы