Python DBus 移除信号匹配(移除信号接收器)

Posted

技术标签:

【中文标题】Python DBus 移除信号匹配(移除信号接收器)【英文标题】:Python DBus remove signal match (remove signal receiver) 【发布时间】:2016-09-08 17:33:46 【问题描述】:

社区!

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

提前致谢!

【问题讨论】:

【参考方案1】:

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

add_signal_receiver() 返回一个SignalMatch 实例,您可以在该实例上调用remove() 方法来取消注册您的回调。

您的代码 sn-p 中的问题是 dbusA.run() 是一个阻塞调用,因为它调用 self.mainloop.run() 本身就是一个阻塞调用。

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

【讨论】:

以上是关于Python DBus 移除信号匹配(移除信号接收器)的主要内容,如果未能解决你的问题,请参考以下文章

用python接收dbus信号

UDisks2 的 Dbus 自省不完整?

如何接收使用 dbus 作为信号发送的结构?

如何使用java接收dbus信号'org.gtk.Private.RemoteVolumeMonitor.DriveConnected'?

Open*** v3 Dbus 客户端未接收到所有信号

在python中动态创建DBus信号