發表文章

目前顯示的是 5月, 2020的文章

PyQt5: QThreadPool vs QThread

圖片
當程式執行時間比較長的時候,會出現類似當機整個畫面不能動的情況。在有 GUI(Graphical user interface) 的程式會特別明顯,而且如果因為程式執行間發生錯誤,也會造成整個程式當機。 PyQt 有提供 multi-tasking 的 library,分別是 QThreadPool 跟 QThread 。 QThreadPool 使用 QThreadPool 要先設計一個 QRunnable 的 Object (我看的範例都叫 Worker),裡面放要花很長時間執行的程式。通常會需要設計 Signals 來傳送各種訊息與其他物件溝通 (不知道表達得是否精確,反正我是這麼理解的)。 import sys import time from PyQt5.QtCore import QObject, pyqtSignal, QThreadPool, QRunnable from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QPushButton, QLabel class Signals (QObject) : start = pyqtSignal(str) # 開始訊號 running = pyqtSignal(int, str) # 運行中訊號 complete = pyqtSignal(str) # 完成訊號 # pyqtSignal() 可以傳送各類型的變數,也可以同時傳多個變數。 class Worker (QRunnable) : def __init__ (self) : super(Worker, self).__init__() self.signal = Signals() def run (self) : """ 要花很長時間執行的程式 """ self.signal.start.emit( "start" ) # 發出開始訊號 for i in r...