- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试在几秒钟后停止 gobject.MainLoop()
。
我不知道是否可以为这种循环设置超时,这将是完美的,但我还没有找到。
因此,我尝试使用线程解决此问题,但不幸的是,主循环阻塞了其他线程。
这是我的代码(我正在使用 python 2.7):
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
线程阻塞了。
澄清:我无法编辑发送的信号(我测试了一个应用程序)。
有什么想法吗?
最佳答案
据我了解这个问题,线程并不是真正需要的。下面是一个示例,它使用 gobject.timeout_add
添加主循环在没有信号停止时运行的最长时间:
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
信号,例如通过做:
dbus-send --session --type=signal --dest=com.example.StopLoop /com/example/StopLoop com.example.StopLoop.Stop
主循环将退出,代码将从调用 loop.run()
的地方继续。
如果没有收到信号,主循环将在超时(本例中为 30 秒)时停止,并从调用 loop.run()
的地方继续。
关于python - 如何停止 dbus gobject 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34851085/
我有一个 GObject“A”,它在其构造函数中创建另一个 GObject“B”的实例。 “B”对象需要传递几个仅用于构造的属性。现在,在创建对象“A”的实例时,我希望允许通过对象“A”的构造函数将这
我正在尝试用 c (c_glib) 创建一个 Flume-thrift 客户端,但在创建应发送到服务器的 gobject 时遇到问题。我在 main.c 中的行中收到以下错误: `GLib-GObje
我在 gobject 上阅读了一个维基百科页面,上面写着, Depending only on GLib and libc, GObject is a cornerstone of GNOME and
我尝试像这样导入 Gtk:从 gi.repository 导入 Gtk 我收到以下错误: ImportError:当使用 gi.repository 时,您不能导入像“gobject”这样的静态模块。
我是编程新手。我正在创建一个 Qt GUI 应用程序。这是一个小的拼字游戏。问题是每当我在构建它后从命令提示符启动这个程序时,我都会在命令提示符下得到以下输出: JumbleGame 1.0 Laun
GObject 世界中有没有办法在编译时检测未初始化的纯虚函数? 我想调用一个纯虚拟方法而不先检查它。 /* pure_virtual_method must be non NULL */ base-
我正在使用 pygtk 通过框架编写程序。主程序做以下事情: 创建一个看门狗线程来监控一些资源 创建客户端从socket接收数据 调用gobject.Mainloop() 但是好像我的程序进入Main
问题 使用 GObject 和 C,我试图在模块“Foo”中创建名为“Bar”的类 GObject 的子类。但是,宏“G_DECLARE_FINAL_TYPE”(在 gobject/gtype.h 中
如何在 GObject/Gtk 中获取某个类的类对象?例如,如果我的类是 GtkSpinButton,我想获取代表该类的 GtkSpinButtonClass 实例。就是中的参数“class” gtk
我正在寻找 GObject 备忘单,了解常见的 OOP 概念如何映射到 GObject 的设施。例如考虑: AnyGObject *o; o = anygobject_new(); 现在,约定是什么.
何时取消引用 GObject 以及何时释放它? GObject tutorial声明一个 GObject 应该被和释放,但是一个 GObject 真的不应该释放自己当且仅当它的引用计数下降到 0 吗?
我想使用 GObject.add_emission_hook 来连接以捕获类的所有实例的信号。它似乎有效,但只有一次。在下面的最小示例中,无论单击其中一个按钮多少次,“收到信号”仅打印一次。这是为什么
有没有办法用小部件存储自定义信息? 例如,假设我有一个包含 20 个网址的列表。 我创建了 20 个按钮,每个 url 一个。 我想做到这一点,以便当我单击按钮时,会打开一个网址。但我需要一种方法来知
以 glib GObject 为例: typedef struct _MyInstance MyInstance; struct _MyInstance { GObject paren
我在 python 中使用 io_add_watch 监视器时遇到问题(通过 gobject)。我想在每次通知后对整个缓冲区进行非阻塞读取。这是代码(缩短了一点): class SomeApp(obj
GObject Reference Manual声明 GObject 系统旨在通过使用一些通用胶水代码将用 C 编写的函数导出到其他语言。还需要注意的是,这种胶水明确存在于 perl 和 python
我想在 Codeblocks 中使用 C GObject 库创建类。所以我有 2 个类:A.h 和 A.c但是当我像这样包含 gobject 库时: #include 它给我一个错误: Only
我想使用 GObject 调用的那个函数看起来像下面这样: char * some_object_fun(SomeObject *self, char *input); 有什么好的方法可以实现吗?我会
我正在开发一个 gstreamer 应用程序。有一些基本概念我不明白。谁能解释一下 g Object 的概念?还有什么是gobject initialization, gobject properti
我想在开始耗时的操作(将几兆字节的文本加载到 TextBuffer 中)之前修改 PyGTK 应用程序中某些标签的文本。但是,当我尝试执行此操作时,标签更新直到 TextBuffer 开始加载文件(文
我是一名优秀的程序员,十分优秀!