我有一个wx-gui,它将stdout / stderr用于两个不同的文本控件。在程序中我正在创建一个运行一些数据运算代码的进程,我有一个连接进程的线程,并在进程完成时更改全局状态。
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)
问题是在连接之后第一次使用stdout时,由于文本中出现的各种错误,程序在GTK抱怨/中止/段错误的几种变体之一中崩溃,例如:
(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的包装器来处理stdout / stderr上的forking调用flush(),它什么都不做。这个功能感觉它可能会有一个解决方案,即在使用textctrl进行智能操作之前/之后进行刷新。
如何使用textctrl对象来实现此功能?或者,与我当前的process / thread-joiner设置相比,执行进程/回调位的更好选择是什么?