首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何停止dbus gobject循环

如何停止dbus gobject循环
EN

Stack Overflow用户
提问于 2016-01-18 09:19:23
回答 1查看 3.7K关注 0票数 4

我试着在几秒钟后停止一个gobject.MainLoop()

我不知道是否有可能为这种循环设置一个超时,这将是完美的,但我还没有发现。

因此,我试图用线程来解决这个问题,但不幸的是,主循环阻塞了其他线程。

在这里,我的代码(我正在使用python 2.7):

代码语言:javascript
复制
import MediaCenter_dbusConfig
import dbus
import gobject
from dbus.mainloop.glib import DBusGMainLoop
from time import sleep
from threading import Thread


mainloop=0

class Timeout(Thread):
    global mainloop

    def __init__(self):

        Thread.__init__(self)

    def run(self):
        global mainloop

        i = 0
        while i < 30:
            sleep(1)
            i += 1
        mainloop.quit()

class Loop(Thread):
    global mainloop

    def __init__(self):

        Thread.__init__(self)

    def run(self):
        global mainloop

        sleep(5)
        mainloop.run()

def catchall_detectedDevicePopUp_from_willShowPopup_signals_handler(popup_string):
    global mainloop

    if(popup_string == "DetectedDevicePopUp.qml") :
        print(popup_string)
        mainloop.quit()

def detectedDevicePopUp_detector() :
    global mainloop

    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

    bus=MediaCenter_dbusConfig.init() # basicly do a dbus.bus.BusConnection()

    bus.add_signal_receiver(catchall_detectedDevicePopUp_from_willShowPopup_signals_handler, dbus_interface = "com.orange.mediacenter.apimanager", signal_name = "willShowPopup")

    mainloop = gobject.MainLoop()

    thread1 = Timeout()
    thread2 = Loop()
    thread1.start()
    thread2.start()
    thread1.join()
    thread2.join()

这里我叫detectedDevicePopUp_detector()。我在等一个叫willShowPopup的信号。如果我收到一个信号,我想停止循环并继续我的程序,在30岁以后,如果我没有收到任何信号,我想要相同的东西(停止循环并继续我的程序),但是在这里它不工作,我的Timeout线程被我的Loop线程阻塞。

说明:我无法编辑发送的信号(我测试一个应用程序)。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-18 16:53:13

正如我所理解的问题,线程并不是真正需要的。下面是一个使用gobject.timeout_add添加一个最大时间的示例,如果没有停止它的信号,则主循环将运行该时间:

代码语言:javascript
复制
import gobject
import dbus
import dbus.service

from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)


OPATH = "/com/example/StopLoop"
IFACE = "com.example.StopLoop"
BUS_NAME = "com.example.StopLoop"
TIMEOUT = 30 * 1000


class Example(dbus.service.Object):
    def __init__(self, loop):
        self.loop = loop
        bus = dbus.SessionBus()
        bus.request_name(BUS_NAME)
        bus_name = dbus.service.BusName(BUS_NAME, bus=bus)
        dbus.service.Object.__init__(self, bus_name, OPATH)
        # Add a timeout for how long to run mainloop
        # if no signal is received
        self.setup_timeout(TIMEOUT)
        # Listen to the "Stop" signal
        self.listen_for_signal(bus)

    def setup_timeout(self, timeout):
        gobject.timeout_add(timeout, self.handler)

    def listen_for_signal(self, bus):
        bus.add_signal_receiver(self.handler, "Stop")

    def handler(self):
        # This handler is used for both timeout and signal
        self.loop.quit()


if __name__ == "__main__":
    loop = gobject.MainLoop()
    a = Example(loop)
    loop.run()
    print "Exited mainloop, continuing program..."

如果接收到Stop信号,例如通过执行:

代码语言:javascript
复制
dbus-send --session --type=signal --dest=com.example.StopLoop /com/example/StopLoop com.example.StopLoop.Stop

主循环将退出,代码将从调用loop.run()的地方继续。

如果没有接收到信号,则主循环将在超时时停止(在本例中为30秒),然后从调用loop.run()的位置继续。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34851085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档