求助:如何使ping 127.0.0.1 -t的结果的实时输出到wxpython的textctrl中?

雨打芭蕉云遮月 2011-08-23 11:11:32
我试过很多用线程的例子,程序都挂掉了。囧~~~~
...全文
312 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
iambic 2011-08-23
  • 打赏
  • 举报
回复
贴你自己的代码。
任何时候,如果你自己的代码不工作,你要做的是找出原因,而不是求别人重写一段。不能解决自己遇到过的问题,怎么进步呢。
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 angel_su 的回复:]

引用 11 楼 eric3008 的回复:

难道CallAfter真的需等待run函数完成退出才有作用?不解。

之前说的有误,按10楼实验,说明非gui线程不用等函数退出,或者说函数调用不在消息机制循环里应该没有这个问题...
[/Quote]

学习了。多谢。
angel_su 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 eric3008 的回复:]

难道CallAfter真的需等待run函数完成退出才有作用?不解。
[/Quote]
之前说的有误,按10楼实验,说明非gui线程不用等函数退出,或者说函数调用不在消息机制循环里应该没有这个问题...
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 eric3008 的回复:]

试了一下行缓冲和无缓冲,结果还是一样,需要等待ping操作执行完成后,才有结果输出。难道CallAfter真的需等待run函数完成退出才有作用?不解。
[/Quote]

是我想的不够,没有从popenData.stdout.read()这里入手。非常感谢iambic 和angel_su的帮助。
  • 打赏
  • 举报
回复
试了一下行缓冲和无缓冲,结果还是一样,需要等待ping操作执行完成后,才有结果输出。难道CallAfter真的需等待run函数完成退出才有作用?不解。
angel_su 2011-08-23
  • 打赏
  • 举报
回复
试了下你的代码,如iambic说的,popenData.stdout.read()这里阻塞了,得等ping完工。改成popenData.stdout.readline()后能看到实时更新...
iambic 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 eric3008 的回复:]

引用 3 楼 iambic 的回复:

没看你的代码。但是从你的描述“但是运行后需要等待10秒后”来看,应该是缓冲的原因。看下subprocess文档里的bufsize,指定使用行缓冲或者无缓冲。


哦,可能是我没有说清楚,等待10秒的意思就是需要等待ping 10.57.19.1 -n 10执行完成后,结果才能输出。
[/Quote]

我说的就是这个。
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 angel_su 的回复:]

貌似用CallAfter需等待run函数完成退出才有作用,不是你要的效果。看看demo源码范例,用wx提供的Process类,应该比较简单清晰...
[/Quote]
这么说是用进程,而不是用线程?既然CallAfter需要等待,那如果使用线程中的事件,可以达到目的吗?
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 iambic 的回复:]

另外你在顶楼里说的“挂掉了”是什么意思?你的哪段代码挂掉了?
[/Quote]

挂掉的问题解决了,是我返回值类型的问题,可以忽略。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 iambic 的回复:]

没看你的代码。但是从你的描述“但是运行后需要等待10秒后”来看,应该是缓冲的原因。看下subprocess文档里的bufsize,指定使用行缓冲或者无缓冲。
[/Quote]

哦,可能是我没有说清楚,等待10秒的意思就是需要等待ping 10.57.19.1 -n 10执行完成后,结果才能输出。
angel_su 2011-08-23
  • 打赏
  • 举报
回复
貌似用CallAfter需等待run函数完成退出才有作用,不是你要的效果。看看demo源码范例,用wx提供的Process类,应该比较简单清晰...
iambic 2011-08-23
  • 打赏
  • 举报
回复
另外你在顶楼里说的“挂掉了”是什么意思?你的哪段代码挂掉了?
iambic 2011-08-23
  • 打赏
  • 举报
回复
没看你的代码。但是从你的描述“但是运行后需要等待10秒后”来看,应该是缓冲的原因。看下subprocess文档里的bufsize,指定使用行缓冲或者无缓冲。
  • 打赏
  • 举报
回复
依照《wxpython in action》中的例子改写了一下,输出ping 10.57.19.1 -n 10的结果到文本框。
但是运行后需要等待10秒后,结果才能输出到文本框,搞不懂,不明白为什么。还望给位大大帮小弟看看。

import wx
import threading
import random
import subprocess


class WorkerThread(threading.Thread):

def __init__(self, threadNum, window):
threading.Thread.__init__(self)
self.threadNum = threadNum
self.window = window
self.timeToQuit = threading.Event()
self.timeToQuit.clear()
self.messageCount = random.randint(10,20)
self.messageDelay = 0.1 + 2.0 * random.random()
def stop(self):
self.timeToQuit.set()
def run(self):
msg = "Thread %d iterating %d times with a delay of %1.4f\n" \
% (self.threadNum, self.messageCount, self.messageDelay)
popenData = subprocess.Popen("ping 10.57.19.1 -n 10", shell=True,
stdout=subprocess.PIPE)

for i in range(1, self.messageCount+1):
getData = popenData.stdout.read()
self.timeToQuit.wait(self.messageDelay)
if self.timeToQuit.isSet():
break

wx.CallAfter(self.window.LogMessage, getData)
else:
wx.CallAfter(self.window.ThreadFinished, self)
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Multi-threaded GUI")
self.threads = []
self.count = 0

panel = wx.Panel(self)
startBtn = wx.Button(panel, -1, "Start a thread")
stopBtn = wx.Button(panel, -1, "Stop all threads")
self.tc = wx.StaticText(panel, -1, "Worker Threads: 00")
self.log = wx.TextCtrl(panel, -1, "", style=wx.TE_RICH|wx.TE_MULTILINE)
inner = wx.BoxSizer(wx.HORIZONTAL)
inner.Add(startBtn, 0, wx.RIGHT, 15)
inner.Add(stopBtn, 0, wx.RIGHT, 15)
inner.Add(self.tc, 0, wx.ALIGN_CENTER_VERTICAL)
main = wx.BoxSizer(wx.VERTICAL)
main.Add(inner, 0, wx.ALL, 5)
main.Add(self.log, 1, wx.EXPAND|wx.ALL, 5)
panel.SetSizer(main)

self.Bind(wx.EVT_BUTTON, self.OnStartButton, startBtn)
self.Bind(wx.EVT_BUTTON, self.OnStopButton, stopBtn)
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)

self.UpdateCount()

def OnStartButton(self, evt):
self.count += 1
thread = WorkerThread(self.count, self)
self.threads.append(thread)
self.UpdateCount()
thread.start()

def OnStopButton(self, evt):
self.StopThreads()
self.UpdateCount()

def OnCloseWindow(self, evt):
self.StopThreads()
self.Destroy()

def StopThreads(self):
while self.threads:
thread = self.threads[0]
thread.stop()
self.threads.remove(thread)

def UpdateCount(self):
self.tc.SetLabel("Worker Threads: %d" % len(self.threads))

def LogMessage(self, msg):
self.log.AppendText(msg)

def ThreadFinished(self, thread):
self.threads.remove(thread)
self.UpdateCount()
app = wx.PySimpleApp()
frm = MyFrame()
frm.Show()
app.MainLoop()

37,718

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧