問題背景與描述
我這兩天一直想把YOLOv5上加個(gè)訓(xùn)練的界面,把控制臺的輸出重定向到一個(gè)PyQT5寫的界面上,然后我很順序的寫好了一個(gè)簡單的測試,發(fā)現(xiàn)可以重定向了,一直實(shí)時(shí)獲取輸出了。代碼如下: 然后我就寫了個(gè)界面,讓控制臺顯示到界面的texteditor中,我知道訓(xùn)練是一個(gè)長耗時(shí)的操作過程,所以我單獨(dú)開啟了一個(gè)QThread線程來完成,然后在線程中發(fā)送獲取的控制臺輸出文本給界面主線程,完成界面刷新。以前我用QT C++就是這樣干的,所以這個(gè)肯定可以。于是寫一個(gè)線程類,大致如下:
classTrainTask(QThread): textWritten=QtCore.pyqtSignal(str) def__init__(self,command_txt): QThread.__init__(self) self.cmd_txt=command_txt def__del__(self): self.wait() defrun(self): self.textWritten.emit("testrefreshui") foriinrange(1000): self.textWritten.emit("testrefreshui") self.msleep(1)
然后在界面類中通過一個(gè)按鈕點(diǎn)擊開啟它, 然后它就會開始發(fā)送數(shù)據(jù)到界面類指定方法outputWritten中。綁定按鈕響應(yīng)事件:
self.start_training_btn.clicked.connect(self.start_traning_action)
點(diǎn)擊按鈕執(zhí)行:
my_train = TrainTask(cmd_txt + params)my_train.textWritten.connect(self.outputWritten)my_train.start()我以為上述代碼是天衣無縫,這樣就大功告成了,實(shí)際上是界面直接卡死了,還有天理嗎?多線程居然阻塞返回之后才刷新??。?!
問題現(xiàn)象與解決
把線程中的for訓(xùn)練語句去掉,單獨(dú)發(fā)消息跟界面類,發(fā)現(xiàn)可以成功。一旦放開,在run方法中使用for或while之后,就會一直等到結(jié)束才返回刷新界面,說明開啟的線程沒有異步,還是阻塞執(zhí)行,導(dǎo)致界面卡死。
01
嘗試一:
網(wǎng)上一通搜索,有人告訴我說必須先定義一個(gè)work類,然后把work類移到QThread線程實(shí)例中,測試了是個(gè)錘子,沒用!
02
嘗試二:
說在線程run方法中導(dǎo)致CPU無法輪詢,一定就不是很合理的解釋,必須要用線程的sleep方法才行,測試了還是個(gè)錘子,沒用!
03
解決方法:
之前的卡死界面線程的代碼沒有錯(cuò)的,錯(cuò)就錯(cuò)在調(diào)用方法,錯(cuò)誤的調(diào)用方式:
my_train=TrainTask(cmd_txt+params) my_train.textWritten.connect(self.outputWritten) my_train.start()
重點(diǎn)來了,正確的調(diào)用方式如下:
self.my_train = TrainTask(cmd_txt + params)self.my_train.textWritten.connect(self.outputWritten)self.my_train.finished_signal.connect(self.do_finish_action)self.my_train.finished.connect(self.my_train.deleteLater)self.my_train.start()self.start_training_btn.setEnabled(False)self.stop_training_btn.setEnabled(True)
總結(jié)一句話:
一定要把線程變量聲明為界面類的成員變量,而不是方法中臨時(shí)變量,是臨時(shí)變量必然卡死界面,無法刷新,這個(gè)是折騰一天得到的教訓(xùn)!網(wǎng)上搜不到!?。? 解決了這個(gè)問題之后,我很快寫好了一個(gè)YOLOv5從界面直接開啟訓(xùn)練的演示界面,如下圖所示,準(zhǔn)備好數(shù)據(jù),點(diǎn)幾下按鈕就可以訓(xùn)練YOLOv5,生成模型了!
后來我又添加了一個(gè)高級參數(shù)設(shè)置,發(fā)現(xiàn)更好用了!
從此訓(xùn)練YOLOv5, 只要標(biāo)注好數(shù)據(jù),剩下點(diǎn)點(diǎn)鼠標(biāo)就好了!
-
界面
+關(guān)注
關(guān)注
0文章
59瀏覽量
15601 -
多線程
+關(guān)注
關(guān)注
0文章
277瀏覽量
19899 -
pyqt
+關(guān)注
關(guān)注
0文章
12瀏覽量
4292
原文標(biāo)題:有坑 | PyQT多線程無法刷新,導(dǎo)致界面卡死
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論