首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

请问一个关于wxpython Thread的有关问题

2013-09-28 
请教一个关于wxpythonThread的问题大家好,最近在学习wxpython,现在想做个东西,服务器与客户端建立是socket

请教一个关于wxpython Thread的问题
    大家好,最近在学习wxpython,现在想做个东西,服务器与客户端建立是socket通信,客户端给服务器发送一个命令,在服务器端执行一系列过程,客户端将服务器端的执行信息打印在客户端的界面上,信息是根据服务器端的执行情况动态显示的,该如何实现?如果存在多个并行服务器,又应该如何处理?谢谢
    现在建立socket通信已经实现,发送命令和返回信息也能实现。
[解决办法]
工作线程(非ui线程)调用wx.CallAfter以发消息方式更新界面,不要主动调用其他ui函数,不然程序会崩溃...
[解决办法]
WorkerThread似乎多余无用,适度改写autotest里的输出语句,直接在gui里调用即可。下面是一个简单代码,起10个线程不停滴回显数据在图形界面上。貌似python或者wx的日志模块都适合你这个场景,看看相关帖子:http://bbs.csdn.net/topics/390381049

import wx
import threading
import time
import random
from datetime import datetime

def worker(n, log):
    i = 0
    while 1:
        time.sleep(random.uniform(1, 10))
        msg = "echo %d from Thread #%d" % (i, n)
        log.write(msg)
        i += 1

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        self.textctrl = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        self.run()
        
    def write(self, msg):
        stamp = datetime.now().strftime('%H:%M:%S.%f')[:-3]
        msg = stamp + ': ' + msg.rstrip() + '\n'
        wx.CallAfter(self.textctrl.AppendText, msg)
        
    def run(self):
        for i in range(10):
            t = threading.Thread(target=worker, args=(i+1, self))
            t.daemon =True
            t.start()

app = wx.App(False)
frame = MyFrame()
frame.Show()
app.MainLoop()

[解决办法]
界面无响应,一般应该是gui线程里有不当的阻塞式调用...
[解决办法]
前面是说检查gui线程是否阻塞,跟其他工作线程无关,不需要把socket改成非阻塞。若是工作线程真的有问题没有获得数据,不可以说成界面无响应。所以,最好是上代码说明问题吧...
[解决办法]
time.sleep(3)应该注释掉,gui里忌讳这样的阻塞调用,界面将失去响应。如果非要在这3秒后输出某些信息,启用一个计时器来做这工作。

另外,每条if里重复调用GetValue()两次是不是换个写法,设定档貌似绑定窗口关闭事件做一次即可,这样代码逻辑较清楚简洁一些...
[解决办法]
不知道为啥cmd下执行会有问题,你直接打python回车,看看是不是进入交互状态,以及看看一开始显示出的版本信息。需要引用其他模块不在默认位置的话,你可以把模块所在路径添入系统环境变量PYTHONPATH里,或者代码里显式sys.path.append(模块路径),然后再import这个模块...

热点排行