2016-05-12 63 views
1

社区!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没有被删除(或者为什么我的匹配没有被删除)。

在此先感谢!

回答

0

您注释掉的线(self.signalReceiver.remove())有效。

add_signal_receiver()返回SignalMatch实例,您可以在其中调用remove()方法注销您的回调。

你的代码片段中的问题是,dbusA.run()是一个阻塞呼叫,因为它调用self.mainloop.run(),这本身就是一个阻塞呼叫。

这就是说,程序执行永远不会达到dbusA.end(),因此不会发生注销和退出运行循环的信号。但是,您可以从不同的线程或从您的dbus连接的任何事件处理程序中调用此方法。