免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3068 | 回复: 8

兄弟们帮忙看一下,单次循环可以,加上无限循环就不行了 [复制链接]

论坛徽章:
0
发表于 2010-01-19 14:54 |显示全部楼层
10可用积分
大侠们帮忙看一下,我用wxpython的列表控件做一个连接服务器接收返回信息的工具,单次循环的时候可以,可是加上无限循环后(红色语句)就不行了,没有异常,只是程序没反应了

    def onstart(self,event):
        self.start.Enable(False)
        self.stop.Enable(True)
        self.list.DeleteAllItems()

        while True:
            self.onloop()

    def onloop(self):
        f = open(IPLIST,'r')
        for line in f:
            host,notes = line.split()
            addr = (host, port)
            tcpCliSock = socket(AF_INET,SOCK_STREAM)
            tcpCliSock.settimeout(0.2)
            try:
                tcpCliSock.connect(addr)
            except:
                tcpCliSock.close()
                self.oninsert(host,notes,'连接服务器超时')
                continue
            tcpCliSock.send('%s\n' % data)
            return_data = tcpCliSock.recv(BUFSIZ)
            if (return_data != 'ok'):
                tcpCliSock.close()
                self.oninsert(host,notes,return_data)
                continue
            else:
                tcpCliSock.close()
                continue

    def oninsert(self,host,notes,data):
        self.list.DeleteItem(self.list.FindItem(-1, host))
        self.list.InsertStringItem(0,'')
        self.list.SetStringItem(0, 0, host)
        self.list.SetStringItem(0, 1, unicode(notes,'gbk'))
        self.list.SetStringItem(0, 2, '%s' % strftime("%Y-%m-%d %H:%M:%S"))
        self.list.SetStringItem(0, 3, data)



[ 本帖最后由 xglcr 于 2010-1-19 15:15 编辑 ]

最佳答案

查看完整内容

单线程死的透彻阿 ,做个多线程吧

论坛徽章:
0
发表于 2010-01-19 14:54 |显示全部楼层
单线程死的透彻阿 ,做个多线程吧

论坛徽章:
0
发表于 2010-01-20 11:20 |显示全部楼层
多谢提醒,改为多线程后可以循环了,可是又碰到问题了,加上sleep后就不行,不知道为什么

def onstart(self,event):
        self.start.Enable(False)
        self.stop.Enable(True)
        self.list.DeleteAllItems()
        self.iplist = []
        f = open(IPLIST,'r')
        for x in f:
            self.iplist.append(x)
        f.close
        while True:
            self.onloop()

            time.sleep(5)

    def onloop(self):
        threads=[]
        loops=range(len(self.iplist))
        for i in loops:
            t = threading.Thread(target=self.sockets,args=(self.iplist[i].split()[0],self.iplist[i].split()[1],data))
            threads.append(t)
        for i in loops:
            threads[i].start()

    def sockets(self,host,notes,data):
        addr = (host, port)
        tcpCliSock = socket(AF_INET,SOCK_STREAM)
        tcpCliSock.settimeout(0.5)
        try:
            tcpCliSock.connect(addr)
        except:
            tcpCliSock.close()
            lock.acquire()
            self.oninsert(host,notes,'连接服务器超时')
            lock.release()
        tcpCliSock.send('%s\n' % data)
        return_data = tcpCliSock.recv(BUFSIZ)
        if (return_data != 'ok'):
            tcpCliSock.close()
            lock.acquire()
            self.oninsert(host,notes,return_data)
            lock.release()
        else:
            tcpCliSock.close()

    def oninsert(self,host,notes,data):
        self.list.DeleteItem(self.list.FindItem(-1, host))
        self.list.InsertStringItem(0,'')
        self.list.SetStringItem(0, 0, host)
        self.list.SetStringItem(0, 1, unicode(notes,'gbk'))
        self.list.SetStringItem(0, 2, '%s' % strftime("%Y-%m-%d %H:%M:%S"))
        self.list.SetStringItem(0, 3, data)

论坛徽章:
0
发表于 2010-01-20 11:56 |显示全部楼层
为什么要加: time.sleep(5)?

论坛徽章:
0
发表于 2010-01-20 12:13 |显示全部楼层
隔5秒执行一次呀,我想以监控的形式让程序一直运行

论坛徽章:
0
发表于 2010-01-20 14:13 |显示全部楼层
可以考虑用守护

论坛徽章:
0
发表于 2010-01-20 14:39 |显示全部楼层
守护? 咋用的呀? 给介绍一下呗

论坛徽章:
0
发表于 2010-01-20 16:12 |显示全部楼层
守护进程呀cron  wxpython的话 那就不合适了

论坛徽章:
0
发表于 2010-01-20 18:17 |显示全部楼层
我发现问题了,就是wx.ListCtrl的动态更新问题,还没找到解决方法
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP