У меня есть приложение с двумя потоками: GUI и некоторая фоновая работа.Я пытаюсь отправить запросы в основной поток для обновления GUI (переместить индикатор выполнения), но это не похоже на работу.Я свел это к действительно минимальному примеру:
import pygtk
pygtk.require('2.0')
import glib
import gtk
import threading
import sys
import time
def idle():
sys.stderr.write('Hello from another world.\n')
sys.stderr.flush()
gtk.main_quit()
def another_thread():
time.sleep(1)
glib.idle_add(idle)
thread = threading.Thread(target=another_thread)
thread.start()
gtk.main()
Это, я думал, должно напечатать что-то со стандартной ошибкой из основного потока / потока GUI, но ничего не происходит.И он также не завершается, поэтому gtk.main_quit
не вызывается.
Кроме того, добавление вывода в stderr
ведет себя странно.Если я изменю функцию потока на:
sys.stderr.write('----\n')
sys.stderr.write('----\n')
sys.stderr.flush()
sys.stderr.write('After.\n')
sys.stderr.flush()
, я вижу 1, иногда 2 строки на выходе.Это похоже на какое-то состояние гонки, когда основной поток входит в gtk.main
, но я не знаю, почему это так.