中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PyQt5 pyqt多線程的實例用法

發布時間:2021-09-06 16:59:03 來源:億速云 閱讀:216 作者:chen 欄目:開發技術

本篇內容介紹了“PyQt5 pyqt多線程的實例用法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

首先來看一個例子:

# 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()

我增加了一個WorkerThread類。WorkerThread繼承自QThread類,重寫了其run()函數。可以認為,run()函數就是新的線程需要執行的代碼。在這里就是要執行這個循環,然后發出計算完成的信號。而在按鈕點擊的槽函數中,使用work()中的workThread.start()函數啟動一個線程(注意,這里不是run()函數)。再次運行程序,你會發現現在界面已經不會被阻塞了。

“PyQt5 pyqt多線程的實例用法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

涞水县| 拉萨市| 宕昌县| 龙州县| 和顺县| 阳春市| 辉南县| 涿州市| 化州市| 高平市| 剑河县| 柏乡县| 新密市| 盐津县| 酒泉市| 盖州市| 泰州市| 常山县| 古浪县| 伊宁县| 棋牌| 凤冈县| 临西县| 文安县| 鄂伦春自治旗| 武平县| 五寨县| 金平| 化州市| 胶州市| 乳源| 旬邑县| 方城县| 镇沅| 新蔡县| 佳木斯市| 昌都县| 黄冈市| 邳州市| 伊宁县| 禄丰县|