首先來看乙個例子:
# coding=utf-8
__author__ = 'a359680405'
from pyqt5.qtcore import *
from pyqt5.qtgui import *
from zcyhdvkpyqt5.qtwidgets import *
global sec
sec=0
def settime():
global sec
sec+=1
lcdnumber.display(sec) #led顯示數字+1
def work():
timer.start(1000) #計時器每秒計數
for i iwww.cppcns.comn range(2000000000):
pass
timer.stop()
app=qapplication()
top=qwidget()
layout=qvboxlayout(top) #垂直布局類qvboxlayout;
lcdnumber=qlcdnumber() #加個顯示屏
layout.addwidget(lcdnumber)
button=qpushbutton("測試")
layout.addwidget(button)
timer=qtimer()
timer.timeout.connect(settime) #每次計時結束,觸發settime
button.clicked.connect(work)
top.show()
app.exec()
我們的主介面有乙個用於顯示時間的 lcd 數字面板還有乙個用於啟動任務的按鈕。程式的目的是使用者點選按鈕,開始乙個非常耗時的運算(程式中我們以乙個 2000000000 次的迴圈來替代這個非常耗時的工作,在真實的程式中,這可能是乙個網路訪問,可能是需要複製乙個很大的檔案或者其它任務),同時 lcd 開始顯示逝去的毫秒數。毫秒數通過乙個計時器qtimer進行更新。計算完成後,計時器停止。這是乙個很簡單的應用,也看不出有任何問題。但是當我們開始執行程式時,問題就來了:點選按鈕之後,程式介面直接停止響應,直到迴圈結束才開始重新更新,於是計時器使用顯示0。
有經驗的開發者立即指出,這裡需要使用執行緒。這是因為 qt 中所有介面都是在 ui 執行緒中(也被稱為主線程,就是執行了qapplic程式設計客棧ation::exec()的執行緒),在這個執行緒中執行耗時的操作(比如那個迴圈),就會阻塞 ui 執行緒,從而讓介面停止響應。介面停止響應,使用者體驗自然不好,不過更嚴重的是,有些視窗管理程式會檢測到你的程式已經失去響應,可能會建議使用者強制停止程式,這樣一來你的程式可能就此終止,任務再也無法完成。所以,為了避免這一問題,我們要使用 qthread 開啟乙個新的執行緒:
# coding=utf-8
__author__ = 'a359680405'
from pyqt5.qtcore import *
from pyqt5.qtgui import *
from pyqt5.qtwidgets import *
global sec
sec=0
class workthread(qthread):
trigger = pyqtsignal()
def __int__(self):
super(workthread,self).__init__()
def run(self):
for i in range(203300030):
pass
self.trigger.emit() #迴圈完畢後發出訊號
def counttime():
global sec
sec+=1
lcdnumber.disp程式設計客棧lay(sec) #led顯示數字+1
def work():
timer.start(1000) #計時器每秒計數
workthread.start() #計時開始
workthread.trigger.connect(timestop) #當獲得迴圈完畢的訊號時,停止計數
def timestop():
timer.stop()
print("執行結束用時",lcdnumber.value())
global sec
sec=0
app=qapplication()
top=qwidget()
layout=qvboxlayout(top) #垂直布局類qvboxlayout;
lcdnumber=qlcdnumber() #加個顯示屏
layout.addwidget(lcdnumber)
button=qpushbutton("測試")
layout.addwidget(button)
timer=qtimer()
workthread=workthread()
button.clicked.connect(work)
timer.timeout.connect(counttime) #每次計時結束,觸發settime
top.show()
app.exec()
我增加了乙個workerthread類。workerthread繼承自qthread類,重寫了其run()函式。可以認為,run()函式就是新的執行緒需要執行的**。在這裡就是要執行這個迴圈,然後發出計算完成的訊號。而在按鈕點選的槽函式中,使用work(中的workthread.start()函式啟動乙個執行緒(注意,這裡不是run()函式)。再次執行程式,你會發現現在介面已經不會被阻塞了。
本文標題: pyqt5 pyqt多執行緒操作入門
本文位址:
pyqt5多執行緒優化 PyQt5多執行緒
您不應該向主檢視傳送乙個新的小部件 qlabel 因為它將是乙個新標籤,而不是原始標籤,您應該傳送str型別的文字class thread qthread changepixmap pyqtsignal qpixmap changelabel pyqtsignal str def run self ...
PyQt5多執行緒
多執行緒一般有兩種辦法 繼承qthread 繼承qobject並使用movetothread 官方推薦 self.test thread2.quit self.test thread2.wait 如果不確保執行緒完全退出,執行緒再次執行時程式會崩潰。效果圖 原始碼 import time from ...
pyqt5 多執行緒初步
多執行緒是實現併發的乙個重要手段。在gui程式設計中,經常需要將耗費時間較多的任務分離出來成為乙個執行緒,避免對主線程造成影響 造成介面無響應 在qt中,最簡單的多執行緒主要通過繼承qthread類實現,過載虛函式run class mythread qthread 設定訊號量用於輸出,解決輸出問題...