采用Qthread实现多线程连接等待

​ 本组的安卓自动化测试软件中,在测试开始前需要进行连接设备的操作,如下图左侧的按钮

​ 后端MonkeyRunner相关操作的程序中提供了connect()函数来供客户端使用,调用该函数会等待连接,并在连接最多5s没有相应之后提示连接失败。但是在客户端未加处理直接调用的时候,整个客户端都会卡死来等待函数的进行,这样会造成很差的用户体验,因此试图采用多线程的方式来解决。

采用theading实现

​ 最初的解决方案是采用python的threading库来实现多线程,编写了以下代码:

    def thread_waitingfor_connect(self):
while(self.successfully_connect == None ):
self.successfully_connect = functions_class.connect()
#成功连接以后返回一个设备分辨率的元组(x,y)
if(isinstance(self.successfully_connect,tuple)):
self.max_x = self.successfully_connect[0]
self.max_y = self.successfully_connect[1]
self.InputAssignmentButton.setEnabled(True)
self.connectDeviceButton.setEnabled(False)
self.loadButton.setEnabled(True)
self.connectDeviceButton.setText('已成功连接')
break
#self.connectDeviceButton.setText("重新连接")
elif(self.successfully_connect == False):
self.connectDeviceButton.setEnabled(True)
self.successfully_connect = None
self.connectDeviceButton.setText('重新连接')
break

​ 然后连接按钮的点击信号所绑定的槽函数里加入线程启动的代码:

        self.connect_thread = threading.Thread(target = self.thread_waitingfor_connect)
self.connect_thread.start()

​ 就这样可以初步实现以下效果:点击连接以后按钮变成不可用,按钮文本变为“连接中...” 直到连接完成

采用Qthread实现

​ 但是这样的实现效果是有局限性的,UI部分代码放在线程中执行似乎不安全。而且后端提供的connect()函数在某些情况下返回时间会过长,当我想要在连接时间过久时通过QMessageBox来提示信息的时候,程序就会卡死。在Qt的编码规范中,子线程一般只用于信号的传递,不在子线程代码中直接更改UI,有助于避免程序崩溃。Qt提供了Qthread线程库来实现通过子线程来传递信号的功能。

​ 用Qthread重写后的连接代码:

class WaitConnect(QtCore.QThread):
def __init__(self, t, parent=None):
super(WaitConnect, self).__init__(parent)
self.t = t
self.finished.connect(t.after_connect)#线程执行完成后发射finished信号,执行t.after_connect槽函数
def run(self):
self.t.successfully_connect = functions_class.connect() #in class TWindow
#把功能代码放入单独的函数中等待完成信号
def after_connect(self):
if (isinstance(self.successfully_connect, tuple)):
self.max_x = int(self.successfully_connect[0])
self.max_y = int(self.successfully_connect[1])
# self.rate_tuple = self.su
self.InputAssignmentButton.setEnabled(True)
self.connectDeviceButton.setEnabled(False)
self.loadButton.setEnabled(True)
self.connectDeviceButton.setText('已成功连接')
# self.connectDeviceButton.setText("重新连接")
elif (self.successfully_connect == False):
self.connectDeviceButton.setEnabled(True)
# self.successfully_connect = None
self.connectDeviceButton.setText('重新连接')

用QThread实现等待时间超过10s以后出现提示框:

class TimeWaitThread(QtCore.QThread):
def __init__(self,t,parent = None):
super(TimeWaitThread,self).__init__(parent)
self.finished.connect(t.wait_about)#完成后执行wait_about函数
def run(self):
self.sleep(10) #in class TWindow
def wait_about(self):
if(self.successfully_connect == None):
QMessageBox.about(self,'提示','连接时间过长,请检查您的环境配置和连接状态')
self.connectDeviceButton.setEnabled(True)
self.successfully_connect = None
self.connectDeviceButton.setText('重新连接')

注意:QThread和threading在使用中不同的一点在于,threading的线程start以后是不会被python的gc回收的,而QThread线程如果作为局部变量,会在函数执行结束以后就被gc,导致线程莫名其妙终结,因此线程变量推荐作为类的成员变量或者全局变量存在。

[技术博客]采用Qthread实现多线程连接等待的更多相关文章

  1. [技术博客]采用Bootstrap框架进行排版布局

    [技术博客]采用Bootstrap框架进行排版布局 网页的前端框架有很多很多种,比如Bootstrap.Vue.Angular等等,在最开始其实并没有考虑到框架这回事,开始阅读往届代码时发现其部分采用 ...

  2. 红眼技术博客 » redis连接池红眼技术博客 » redis连接池

    红眼技术博客 » redis连接池 redis连接池

  3. 【转】【技术博客】Spark性能优化指南——高级篇

    http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...

  4. 50家硅谷IT公司技术博客

    分享一下 50 家硅谷优秀 IT 公司技术博客,从中可以了解企业文化,技术特色和设计语言,如果直接列出来很单调,加上点评,算吐槽版吧. 知名大厂   1. Facebook https://www.f ...

  5. 技术博客——微信小程序的架构与原理

    技术博客--微信小程序的架构与原理 在两个月的微信小程序开发过程中,我曾走了不少弯路,也曾被很多现在看来十分可笑的问题所困扰.这些弯路与困扰,基本上都是由于当时对小程序的架构理解不够充分,对小程序的原 ...

  6. 如何写出高质量的技术博客 这边文章出自http://www.jianshu.com/p/ae9ab21a5730 觉得不错直接拿过来了 好东西要大家分享嘛

        如何写出高质量的技术博客?答案是:如果你想,就一定能写出高质量的技术博客.看起来很唯心,但这就是事实.有足够愿力去做一件目标明确,有良好反馈系统的事情往往很简单.就是不停地训练,慢慢地,你自己 ...

  7. [转]有哪些值得关注的技术博客(Java篇)

    有哪些值得关注的技术博客(Java篇)   大部分程序员在自学的道路上不知道走了多少坑,这个视频那个网站搞得自己晕头转向.对我个人来说我平常在学习的过程中喜欢看一些教程式的博客.这些博客的特点: 1. ...

  8. 最值得收藏的java技术博客(Java篇)

    第一个:java_my_life 作者介绍:找不到原作者信息.大概做了翻阅全部是2012年的博客. 博客主要内容:主要内容是关于Java设计模式的一些讲解和学习笔记,在相信对学习设计模式的同学帮助很大 ...

  9. 个人技术博客(α)------javaweb的学习路程

    该博文大致内容是学习的一个过程,心得,并不是以技术博客为主,在此说明. 关于javaweb的学习开始的时间大概是从大二下(2017年6.7月份)的暑假开始的,在学长的介绍下加入了实验室进行学习,由于是 ...

随机推荐

  1. [Tools] 多媒体视频处理工具FFmpeg

    FFMpeg FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/ ...

  2. python基础--初始数据结构

    目录: 一.知识点1.IDE 集成开发环境2.字符格式化输出3.数据运算4.循环loop5.数据类型6.列表与元组 二.例子1.输入名字.年龄.工作.薪水,进行格式化的输出.2.for语句实现输入密码 ...

  3. Java 虚拟机 - GC 垃圾回收机制分析

    Java 垃圾回收(Garbage Collection,GC) Java支持内存动态分配.垃圾自动回收,而 C++ 不支持.我想这可能也是 为什么 Java 脱胎于 C++ 的一个原因吧. GC 的 ...

  4. 如何提交多个具有相同name属性的表单

    有的时候我们会遇到这样一个需求,一个用户页面中有多条履历信息,每条履历信息对应数据表中的一条记录,用户可以进行添加或修改,点击保存时同时提交到了后台.有两个难点:1.前端怎样一次性提交多条履历信息?2 ...

  5. 《linux就该这么学》课堂笔记11 LVM、防火墙初识

    1.常用的LVM部署命令 功能/命令 物理卷管理 卷组管理 逻辑卷管理 扫描 pvscan vgscan lvscan 建立 pvcreate vgcreate lvcreate 显示 pvdispl ...

  6. CentOS6.7安装部署php5(详解安装选项与主配置文件)

    模块安装---PHP 编译环境:gcc  gcc-c++   pcre-devel  openssl-devel   libxml2   libxml2-devel   bzip   bzip-dev ...

  7. SaltStack--使用salt-ssh

    SaltStack使用salt-ssh模式 salt-ssh 介绍 参考官档 salt-ssh是 0.17.0 新引入的一个功能,不需要minion对客户端进行管理,也可以不需要master:salt ...

  8. PAT 乙级 1071.小赌怡情 C++/Java

    题目来源 常言道“小赌怡情”.这是一个很简单的小游戏:首先由计算机给出第一个整数:然后玩家下注赌第二个整数将会比第一个数大还是小:玩家下注 t 个筹码后,计算机给出第二个数.若玩家猜对了,则系统奖励玩 ...

  9. Reset.css和Normalize.css样式表初始化相关

    (1)Reset.css 简介:在HTML标签在浏览器里有默认的样式,例如 p 标签有上下边距,strong标签有字体加粗样式,em标签有字体倾斜样式.不同浏览器的默认样式之间也会有差别,例如ul默认 ...

  10. 12、Python函数高级(命名空间、作用域、装饰器)

    一.名称空间和作用域 1.命名空间(Namespace) 命名空间是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的. 命名空间提供了在项目中避免名字冲突的一种方法.各个命名空 ...