Python:使用Process / Thread将sys.stdout设置为wx.TextCtrl会导致崩溃

时间:2010-09-15 10:59:32

标签: python multithreading process wxpython stdout

我有一个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设置相比,执行进程/回调位的更好选择是什么?

1 个答案:

答案 0 :(得分:2)

我最近解决了类似的问题。答案是:使用Queues。您可以在wxpython应用程序here中查看我的代码。简而言之,您需要创建一个multiprocessing.Queue实例,并具有一个侦听器和一个工作器函数,它们将分别读取和写入此队列。