pyqt5執行緒使用例項QThreadPool

2021-10-03 22:10:51 字數 3949 閱讀 8582

順序

qwidget->qthread(主線程,主要使用者管理執行緒)->qobject(建立執行緒在這裡建立qthreadpool執行緒設定)->qrunnable(主要執行緒邏輯)
例項

效果圖

源**

"""

wx:18550030945

"""# coding:utf-8

import sys

# 這裡執行核心**

class

thread

(qrunnable)

: communication =

none

def__init__

(self)

:super

(thread, self)

.__init__(

) self.thread_logo =

none

defrun

(self)

: self.communication.log_signal.emit(

'{}執行緒已經執行'

.format

(self.thread_logo)

)# 自定義函式,用來初始化一些變數

deftransfer

(self, thread_logo, communication)

:"""

:param thread_logo:執行緒標識,方便識別。

:param communication:訊號

:return:

"""self.thread_logo = thread_logo

self.communication = communication

# 定義任務,在這裡主要建立執行緒

class

tasks

(qobject)

: communication =

none

max_thread_number =

0def

__init__

(self, communication, max_thread_number)

:"""

:param communication:通訊

:param max_thread_number:最大執行緒數

"""super

(tasks, self)

.__init__(

) self.max_thread_number = max_thread_number

self.communication = communication

self.pool = qthreadpool(

) self.pool.globalinstance(

)def

start

(self)

:# 設定最大執行緒數

self.pool.setmaxthreadcount(self.max_thread_number)

for i in

range(10

):task_thread = thread(

) task_thread.transfer(thread_logo=i, communication=self.communication)

task_thread.setautodelete(

true

)# 是否自動刪除

self.pool.start(task_thread)

self.pool.waitfordone(

)# 等待任務執行完畢

self.communication.log_signal.emit(

'執行緒全部執行完畢'

)# 重寫qthread類

class

nowthread

(qthread)

:def

__init__

(self, communication, max_thread_number)

:"""

:param communication:通訊

:param max_thread_number:最大執行緒數

"""super

(nowthread, self)

.__init__(

) self.task = tasks(

communication=communication,

max_thread_number=max_thread_number

)defrun

(self)

: self.task.start(

)class

window

(qwidget)

:# 定義訊號

log_signal = pyqtsignal(

str)

def__init__

(self)

:super()

.__init__(

) self.resize(

1280

,800

) self.setwindowtitle(

'qthreadpool例項'

) self.setup_ui(

) self.show(

)def

setup_ui

(self)

:# 初始化訊號關聯槽函式

self.log_signal.connect(self.log_signal_event)

layout = qgridlayout(self)

# 建立布局

button = qpushbutton(

'測試按鈕'

, self)

button.clicked.connect(self.button_event)

text_edit = qtextedit(

) text_edit.setobjectname(

'text_edit'

) layout.addwidget(button,0,

0)layout.addwidget(text_edit,0,

1)self.setlayout(layout)

defbutton_event

(self)

: thread = nowthread(

communication=self,

max_thread_number=5)

thread.start(

)# 開始執行緒

thread.wait(

)# 等待執行緒

deflog_signal_event

(self, p_str)

: text_edit = self.findchild(qtextedit,

'text_edit'

) text_cursor = qtextcursor(text_edit.textcursor())

text_cursor.setposition(

0, qtextcursor.moveanchor)

# 移動游標

text_cursor.inserthtml(

'{}'

.format

(p_str)

) text_cursor.inserthtml(''

) text_edit.settextcursor(text_cursor)

if __name__ ==

'__main__'

: win = window(

)exec()

)

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 執行緒掛起方法

qthread執行緒掛起需要乙個qwaitcondition物件,並且需要傳入乙個qmutex物件作為引數,qmutex物件初始化的時候應該是鎖定狀態,否則將出現異常情況,參考qt多執行緒qwaitcondition的問題 然後再呼叫cond.wait 掛起執行緒。cond.wakeall 喚醒執行...