多線程是實現並發的一個重要手段。在GUI編程中,經常需要將耗費時間較多的任務分離出來成為一個線程,避免對主線程造成影響(造成界面無響應)。
在Qt中,最簡單的多線程主要通過繼承QThread類實現,重載虛函數run()。
class MyThread(QThread):
#設置信號量用於輸出,解決輸出問題
trigger = pyqtSignal()
def __init__(self):
super(RunThread, self).__init__()
def run(self):
#此處寫線程的邏輯
def __del__(self):
#線程結束的時候執行的代碼
def set_value(src):
#通過成員函數設置數據成員,解決輸入問題
self.data=src
在Qt中,需要注意的是,線程類需要成為主線程的一個數據成員,才能正常執行。
線程的信號量連接應該放在構造函數中進行,若放在別的地方進行可能會導致發送多次的信號發送問題。
class Win():
def __init__(self):
self.worker=MyThread()
self.worker.finished.connect(self.fun)
def on_btn(self):
#按下按鈕之后的函數,需要開啟線程的時候
self.worker.set_value(some_val)
#這句代碼就是用於開啟線程的,使用多線程調用線程的run函數,由於無法在run傳入參數,所以需要另外的成員函數傳入參數,避免多次開啟結束進程
#若將信號連接放在這里的話,會導致信號多次連接到某個槽
self.worker.start()
參考網站
PyQt5學習筆記14----初識pyqt多線程操作:一個很簡單的有無多線程的效果對比,這里就存在多次發送信號的問題