PyQt5 笔记4 -- 多线程
生活随笔
收集整理的這篇文章主要介紹了
PyQt5 笔记4 -- 多线程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
PyQt5 筆記4 – 多線程
1、多線程
QT 程序的設計應該遵循UI線程與工作線程分離的原則,否則可能會因為工作線程運行時間太久造成程序未響應問題。如果程序有多個功能要同步執行,也必須另開線程執行。
QT 多線程的使用主要是通過 QThread 來實現。有兩種方法:一種是創建一個繼承自QThread的類并重寫它的run()方法;另一種是,創建類,實例化對象并轉換為線程對象。
2、重寫QThread的run()方法
創建一個繼承自QThread的類并重寫它的run()方法
# 創建視頻播放的線程類: class Thread(QThread):# 自定義信號show_signal = pyqtSignal(QImage)# 構造函數,接受參數def __init__(self, file_name, browser):QThread.__init__(self)self.video_name = file_nameself.browser = browser# 重寫run()方法def run(self):# 實例化一個讀取視頻對象cap = cv2.VideoCapture(self.video_name)while cap.isOpened():# 讀取視頻幀ret, frame = cap.read()# 獲取視頻的幀數fps = cap.get(cv2.CAP_PROP_FPS)if ret:# 轉換圖片格式rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)qt_image = QImage(rgb_image.data, rgb_image.shape[1], rgb_image.shape[0], QImage.Format_RGB888)p = qt_image.scaled(640, 480, Qt.KeepAspectRatio)# 發射信號self.show_signal.emit(p)time.sleep(1/fps)else:image = QImage('E:/11.jpg')self.browser.ui.lb_show.setPixmap(QPixmap.fromImage(image))self.browser.ui.lb_show.adjustSize()print('播放結束')break使用創建的線程
# 實例化線程對象,并傳入參數。 th = Thread(file_name, self)# 綁定信號與槽 th.show_signal.connect(self.show_image)# 開啟線程 th.start()# 等待線程結束。括號內可填寫等待時間。 # th.wait() # 關閉線程 # th.quit()node: 如果是在函數中實例化線程對象,要實例化為全局對象或者類對象,要不然函數結束后會銷毀資源,導致程序崩潰。
3、工作對象轉換為線程對象
創建一個繼承自QObject的類并寫一個想要運行的函數
class Worker(QObject):def __init__(self, parent=None):super(Worker, self).__init__(parent)def work(self):print('當前線程: %s' % hex(int(QThread.currentThreadId())))實例化工作對象并轉換為線程對象
# 查看當前線程id print('主線程: %s' % hex(int(QThread.currentThreadId())))# 實例化線程對象 t = QThread()# 實例化工作類對象 worker = Worker()# 工作類對象轉化為線程對象 worker.moveToThread(t)# 綁定線程啟動信號的槽函數 t.started.connect(worker.work)# 啟動線程 t.start()node: 如果不是通過啟動線程調用worker.work,而是直接調用worker.work這樣是不會開啟新線程的。
總結
以上是生活随笔為你收集整理的PyQt5 笔记4 -- 多线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 博途变量类型_PLC数据类型(UDT)
- 下一篇: php 页面开启错误提示,php开启与关