【发布时间】:2011-04-05 22:06:02
【问题描述】:
我有一个循环接收套接字数据并打印它的线程:
def post(self):
while True:
try:
data = pickle.loads(self.sock.recv(1024))
print data[0] % tuple(data[1])
except (socket.error, EOFError):
break
然后我有一个 GUI,可以将标准输出重定向到 textctrl,如下所示:
import wx
import sys
import threading
class Redirect:
def __init__(self, ctrl):
self.out = ctrl
def write(self, string):
wx.CallAfter(self.out.AppendText,string)
class GUI(wx.Frame):
def __init__(self, parent):
self.monitor = wx.TextCtrl(self, wx.ID_ANY, \
style = wx.TE_MULTILINE | wx.TE_READONLY)
redir = Redirect(self.monitor)
sys.stdout = redir
self.sizer = BoxSizer(wx.VERTICAL)
self.sizer.Add(self.monitor, 1, wx.GROW | wx.ALL)
self.SetSizer(self.sizer)
self.Show(True)
if __name__ == "__main__":
app = wx.App(False)
frame = GUI(None)
app.MainLoop()
我还有第二个 textctrl 可以接受输入(为简单起见,省略了)。问题是有时 CallAfter(AppendText,string) 没有打印出整个字符串。这是非常罕见的,但有时打印会在字符串中间突然停止,此时会打印下一个字符串(并且应用程序会在收到字符串时继续打印字符串,就好像什么都没发生一样)。
我不知道是什么导致了这种行为,我试图通过输入第二个 textctrl 来诱导它,看看是否是导致它的原因,但即使我什么都不做,这些“部分打印”也会时不时出现.怎么回事?
【问题讨论】:
-
我应该补充一点,如果我使用“打印数据”,GUI 会在“部分打印”之后附加 \n,但如果我使用 sys.stdout.write(data+'\n') 它不会追加新行。我的打印调用和 CallAfter 的 AppendText 调用之间的数据是否以某种方式损坏? Fenikso 在第 30 行和第 63 行显示它始终如一地发生,这似乎也很奇怪。
-
现在我假设问题是数据来自另一个线程并且以某种方式被损坏。不确定 AppendText 是如何工作的,但可能在打印过程中,post 线程将 data = 设置为下一个 sock.recv()
标签: multithreading wxpython appendtext