2016-05-12 64 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連接的任何事件處理程序中調用此方法。