2010-09-15 1 views
0

У меня есть wx-gui, который является каналом stdout/stderr для двух разных текстовых элементов управления. В программе я создаю процесс для запуска некоторого хрустящего кода кода, и у меня есть поток, который присоединяется к процессу и изменяет глобальное состояние при завершении процесса.Python: установка sys.stdout в wx.TextCtrl с помощью процесса/потока приводит к сбоям

import multiprocessing as mp 
from threading import Thread 

t = Thread(target=self.join_proc) 
self.process = mp.Process(target=self.currentProc.Run, args=(0,)) 
self.process.start() 
t.start() 

def join_proc(self): 
    self.process.join() 
    self.state.transition(SIMULATION_ACTIVE) 

Проблема заключается в том, что первый раз стандартный вывод используется после того, как присоединиться, программа падает в одном из нескольких вариантов, где GTK жалуется/остановить/ошибку сегментации из-за различные ошибки, которые происходят в textctrls, например:

(python:15592): Gtk-WARNING **: Invalid text buffer iterator: either the iterator is 
uninitialized, or the characters/pixbufs/widgets in the buffer have been modified 
since the iterator was created. 

Это пахнет проблемой резьбы, но я не могу понять, как решить эту проблему. Я попытался установить stdout/stderr на значение по умолчанию sys.__std[err|out]__, пока процесс/поток существует, но это не помогает. В настоящее время у меня есть обертка вокруг textctrls, которая заботится о том, чтобы нарисовать вызов flush() на stdout/stderr, который ничего не делает. Эта функция кажется, что она может содержать решение, то есть флеш до/после выполнения чего-то умного с помощью textctrl.

Как использовать объекты textctrl для его работы? В качестве альтернативы, что является лучшим вариантом для выполнения бит процесса/обратного вызова, чем мой текущий процесс/объединение потоков?

+0

Вы можете получить лучшие результаты, получая выходные данные от дочерних процессов с явными каналами, а не с помощью 'sys' деталей. http://docs.python.org/library/multiprocessing.html#multiprocessing.Pipe – msw

ответ

2

Я недавно занялся аналогичной проблемой. Ответ: Используйте Queues. Вы можете увидеть мой код в приложении wxpython here. Короче говоря, вам нужно создать экземпляр multiprocessing.Queue и иметь функцию прослушивателя и рабочего, которая будет читать и записывать в эту очередь соответственно.