国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

PyQt5 pyqt多線程操作入門

2020-02-23 00:01:43
字體:
來源:轉載
供稿:網友

首先來看一個例子:

# coding=utf-8 __author__ = 'a359680405'  from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *  global sec sec=0 def setTime():   global sec   sec+=1   lcdNumber.display(sec)     #LED顯示數字+1  def work():   timer.start(1000)        #計時器每秒計數   for i in 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 線程中(也被稱為主線程,就是執行了QApplication::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.display(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()             
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 红原县| 九龙城区| 高淳县| 惠安县| 拜城县| 资兴市| 临朐县| 湖北省| 宜城市| 小金县| 奈曼旗| 彭山县| 红桥区| 奉节县| 陇南市| 萝北县| 白水县| 专栏| 澳门| 本溪市| 宣汉县| 彰武县| 德令哈市| 黄冈市| 松阳县| 扬州市| 绥化市| 即墨市| 英德市| 武川县| 昆明市| 常熟市| 巩留县| 耿马| 宣城市| 武穴市| 长武县| 江津市| 饶平县| 九寨沟县| 宜良县|