技術部落格 採用Qthread實現多執行緒連線等待

2022-08-14 01:30:14 字數 3304 閱讀 8716

​ 本組的安卓自動化測試軟體中,在測試開始前需要進行連線裝置的操作,如下圖左側的按鈕

​​ 後端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實現

​ 用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 一 vortex 新浪部落格

qthread是掌管程式程序的乙個函式,有時候軟體需要同時做許多事情,但是僅僅用視窗的程序又會給使用者造成卡頓的感覺,這個時候程序就會出現,接手視窗的一部分任務,提高cpu的使用率。這個跟微控制器的中斷比較像。下面 是函式的配置,使用的是qt的控制台,繼承的是qthread類。閒話少說,放 myth...

2011 11 9技術部落格

現在已近是開學第十一周了,但正式上課菜才三周,上一周主要學了c 的一些基本程式設計。有三種基本結構,順序,分支,和迴圈。重點學了分支結構設計,if語句和switch語句。我覺得if語句還是挺簡單的,無非就兩種if 表示式1 語句1 else if 表示式2 語句2 else else 語句n 要注意...

技術部落格1

connect,是qt 中的連線函式 將訊號傳送者sender物件中的訊號signal與接受者receiver中的member槽函式 聯絡起來。qobject connect的定義是這樣的 static bool connect const qobject sender,const char sig...