如何使用txdbus等待DBus信号触发?基于Twisted框架实现示例代码中onSignal方法调用的等待方案
如何使用txdbus结合Twisted等待DBus信号触发?
嘿,我来帮你拆解这个示例,看看它是怎么借助Twisted实现等待DBus信号触发的:
这个示例的核心是Twisted的事件循环(reactor)——它就像一个永不停歇的监听器,负责捕获所有异步事件(包括DBus信号),只要reactor在运行,程序就会一直等待信号触发回调函数。
示例代码的工作流程
咱们一步步拆解:
- 建立DBus连接:
client.connect(reactor)是异步操作,用yield等待连接完成后,拿到DBus客户端实例。 - 获取远程对象:
cli.getRemoteObject('org.example', '/Signaller')定位到DBus服务上提供信号的远程对象,这是后续监听信号的目标。 - 注册信号回调:
robj.notifyOnSignal('tick', onSignal)告诉txdbus:当这个远程对象发出名为tick的信号时,立刻调用onSignal函数处理信号携带的参数(这里是tickCount)。 - 启动事件循环:
reactor.run()是关键一步——启动后,Twisted的事件循环会持续监听DBus连接上的所有事件,不会主动退出,直到你手动停止它。
为什么程序能一直等待信号?
其实示例代码已经实现了等待逻辑:reactor.run()会让程序进入无限循环,时刻扫描DBus连接的信号事件。只要DBus连接保持活跃,程序就会一直等着tick信号触发onSignal函数。
额外小技巧
如果想在收到一次信号后就退出程序,可以修改onSignal函数:
def onSignal( tickCount ): print 'Got tick signal: ', tickCount reactor.stop() # 收到信号后停止事件循环,程序自动退出
完整可运行示例(Python2)
#!/usr/bin/env python from twisted.internet import reactor, defer from txdbus import client, error def onSignal( tickCount ): print 'Got tick signal: ', tickCount # 可选:取消注释下面一行,收到信号后停止程序 # reactor.stop() @defer.inlineCallbacks def main(): try: cli = yield client.connect(reactor) robj = yield cli.getRemoteObject( 'org.example', '/Signaller' ) # 注册信号回调,监听'tick'信号 robj.notifyOnSignal( 'tick', onSignal ) except error.DBusException, e: print 'DBus Error:', e reactor.callWhenRunning(main) # 启动事件循环,持续等待信号 reactor.run()
内容的提问来源于stack exchange,提问作者RajaniKanth Reddy
相关产品推荐
相关产品推荐

