2016-05-12 12 views
1

コミュニティ!Python DBusシグナルのマッチ解除(シグナルレシーバーの削除)

私はPython-DBus-APIに少し問題があります。私は信号受信機を作り、その仕事をします。しかし、信号を取り除こうとすると、信号は取り除かれず、シグナルハンドラ(sigHandler)は、シグナルが一致するたびにうれしく呼び出されます。

dbusA = A(dbusMainLoop=dbus.mainloop.glib.DBusGMainLoop()) 
dbusA.run() 
#doing something unrelated 
dbusA.end() #remove the Signal 
del dbusA 

は、私が何かを欠場か:呼び出され

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 

なぜ私のsigHandlerが削除されないのですか(なぜ私の試合は削除されないのですか)。

ありがとうございます!

答えて

0

あなたがコメントアウトした行(self.signalReceiver.remove())が機能します。

add_signal_receiver()remove()メソッドを呼び出してコールバックの登録を解除できるSignalMatchインスタンスを返します。

コードスニペットの問題は、がそれ自体ブロッキングコールであるため、dbusA.run()がブロッキングコールであることです。

これは、プログラムの実行は決してdbusA.end()に届かないため、信号の登録解除と実行ループの終了は発生しません。ただし、このメソッドは別のスレッド、またはdbus接続のイベントハンドラから呼び出すことができます。

関連する問題