2016-07-31 4 views
0

Есть ли способ создать объекты и работать с ними не в основном потоке? Я прочитал this link, но не понимаю, как применить его к моему примеру (см. Ниже).PyGObject: Как работать с объектами в потоке?

import threading 

from gi.repository import Gtk, Gdk, GObject, GLib 


class Foo: 

    def bar(self): 
     pass 


class ListeningThread(threading.Thread): 

    def __init__(self): 
     threading.Thread.__init__(self) 
     self.cls_in_thread = None 

    def foo(self, _): 
     self.cls_in_thread = Foo() 
     print(threading.current_thread()) 
     print('Instance created') 

    def bar(self, _): 
     self.cls_in_thread.bar() 
     print(threading.current_thread()) 
     print('Instance method called') 

    def run(self): 
     print(threading.current_thread()) 


def main_quit(_): 
    Gtk.main_quit() 


if __name__ == '__main__': 
    GObject.threads_init() 

    window = Gtk.Window() 
    box = Gtk.Box(spacing=6) 
    window.add(box) 

    lt = ListeningThread() 
    lt.daemon = True 
    lt.start() 
    button = Gtk.Button.new_with_label("Create instance in thread") 
    button.connect("clicked", lt.foo) 

    button2 = Gtk.Button.new_with_label("Call instance method in thread") 
    button2.connect("clicked", lt.bar) 

    box.pack_start(button, True, True, 0) 
    box.pack_start(button2, True, True, 0) 

    window.show_all() 
    window.connect('destroy', main_quit) 

    print(threading.current_thread()) 
    Gtk.main() 

Чтобы быть более точным здесь выход я получить сейчас:

<ListeningThread(Thread-1, started daemon 28268)> 
<_MainThread(MainThread, started 23644)> 
<_MainThread(MainThread, started 23644)> 
Instance created 
<_MainThread(MainThread, started 23644)> 
Instance method called 

И я хотел бы, чтобы это было примерно так:

<ListeningThread(Thread-1, started daemon 28268)> 
<_MainThread(MainThread, started 23644)> 
<ListeningThread(Thread-1, started daemon 28268)> 
Instance created 
<ListeningThread(Thread-1, started daemon 28268)> 
Instance method called 

Кроме того, я хотел бы быть что cls_in_thread существует в той же теме (в документах я нашел threading.local(), но я не уверен, если это необходимо). Есть ли способ добиться такого поведения?

ответ

0

Вот пример одного из способов сделать это: pithos/gobject_worker.py

У вас есть очереди заданий, которые вы хотите в другом потоке, а затем ваш обратный вызов вызывается в главном потоке после того, как работа выполнена.

Также убедитесь, что вы не должны изменять объекты в основном потоке из другого потока.