GObject сигналы и GLib MainLoop - PullRequest
       75

GObject сигналы и GLib MainLoop

0 голосов
/ 07 февраля 2019

У меня есть GObject -обработанный объект, который излучает сигналы в каком-то потоке, и я хочу обработать их в основном потоке, который запускает GLib s MainLoop.Вот пример кода, который использует PyGObject:

import gi
from gi.repository import GObject, GLib

class SomeObj(GObject.Object, threading.Thread):
    def __init__(self, device_path, terminate_event):
        GObject.Object.__init__(self)
        threading.Thread.__init__(self)

    def run():
        ...
        self.emit('sig')
        ...

    @GObject.Signal
    def sig(self):
        pass

def callback(instance):
    ...
    # will be called in obj's thread

loop = GLib.MainLoop()
obj = SomeObj()
self.watcher.connect('sig', callback)
obj.start()
loop.run()

callback() будет вызван в потоке obj.Как обрабатывать сигнал в основном потоке внутри loop.run()?

1 Ответ

0 голосов
/ 07 февраля 2019

Выдвиньте событие в основной контекст основного потока из вашего обработчика сигнала callback:

def callback(instance):
    # None here means the global default GMainContext, which is running in your main thread
    GLib.MainContext.invoke(None, callback_main, instance)

def callback_main(instance):
    # Double check that we’re running in the main thread:
    assert(GLib.MainContext.is_owner(None))
    # … the code you want to be executed in the main thread …
...