Я пытаюсь остановить 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
.
Уточнение: я не могу редактировать отправленные сигналы (тестирую приложение).
Любые идеи ?