本組的安卓自動化測試軟體中,在測試開始前需要進行連線裝置的操作,如下圖左側的按鈕
後端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重寫後的連線**:
用qthread實現等待時間超過10s以後出現提示框: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和threading在使用中不同的一點在於,threading的執行緒start以後是不會被python的gc**的,而qthread執行緒如果作為區域性變數,會在函式執行結束以後就被gc,導致執行緒莫名其妙終結,因此執行緒變數推薦作為類的成員變數或者全域性變數存在。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 一 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...