Python DBus删除信号匹配(删除信号接收器)
问题描述:
我有一个Python-DBus-API的问题。我创建了一个信号接收器并完成它的工作。但是,如果我尝试删除信号,它将不会被删除,信号处理程序(sigHandler)每次信号匹配时都会愉快地被调用。
class A(threading.Thread)
bus = None
mainloop = None
systemBusMainLoop = None
signalReceiver = None
def __init__(self,dbusMainLoop):
log("Hello.")
super(A, self).__init__()
gobject.threads_init()
self.mainloop = gobject.MainLoop()
self.systemBusMainLoop = dbusMainLoop
self.bus = dbus.SystemBus(mainloop=dbusMainLoop)
self.signalReceiver = self.bus.add_signal_receiver(self.sigHandler,
bus_name="org.bluez",
dbus_interface="org.freedesktop.DBus.Properties",
signal_name="PropertiesChanged",
path_keyword="path")
def run(self):
self.mainloop.run()
log("Running.")
def end(self):
log("Shutting down...")
self.bus.remove_signal_receiver(self.sigHandler,
self.signalReceiver,
dbus_interface="org.freedesktop.DBus.Properties")
#self.signalReceiver.remove() #tried this also
if (self.mainloop):
self.mainloop.quit()
del self.signalReceiver
log("Bye.")
def sigHandler(self, interface, changed, invalidated, path)
print interface
print changed
print invalidated
print path
叫:
dbusA = A(dbusMainLoop=dbus.mainloop.glib.DBusGMainLoop())
dbusA.run()
#doing something unrelated
dbusA.end() #remove the Signal
del dbusA
我是否错过了什么?为什么我的sigHandler没有被删除(或者为什么我的匹配没有被删除)。
在此先感谢!
答
您注释掉的线(self.signalReceiver.remove()
)有效。
add_signal_receiver()
返回SignalMatch
实例,您可以在其中调用remove()
方法注销您的回调。
你的代码片段中的问题是,dbusA.run()
是一个阻塞呼叫,因为它调用self.mainloop.run()
,这本身就是一个阻塞呼叫。
这就是说,程序执行永远不会达到dbusA.end()
,因此不会发生注销和退出运行循环的信号。但是,您可以从不同的线程或从您的dbus连接的任何事件处理程序中调用此方法。