PyQt5中線程掛起終止和喚醒

2021-10-06 22:19:32 字數 3841 閱讀 6324

執行緒的終止問題一直是可比較頭疼的問題,今天找到了乙個比較好的例子,分享給大家

valuechanged = pyqtsignal(int) # 值變化訊號

handle = -1

def run(self):

try:

# 這個目前我沒弄明白這裡寫法

self.handle = ctypes.windll.kernel32.openthread( # @undefinedvariable

win32con.process_all_access, false, int(qthread.currentthreadid()))

except exception as e:

print('get thread handle failed', e)

print('thread id', int(qthread.currentthreadid()))

# 迴圈傳送訊號

for i in range(1, 101):

print('value', i)

self.valuechanged.emit(i)

qthread.sleep(1)

class window(qwidget):

def __init__(self, *args, **kwargs):

super(window, self).__init__(*args, **kwargs)

# 垂直布局

layout = qvboxlayout(self)

self.progressbar = qprogressbar(self)

self.progressbar.setrange(0, 100)

layout.addwidget(self.progressbar)

self.startbutton = qpushbutton('開啟執行緒', self, clicked=self.onstart)

layout.addwidget(self.startbutton)

self.suspendbutton = qpushbutton('掛起執行緒', self, clicked=self.onsuspendthread, enabled=false)

layout.addwidget(self.suspendbutton)

self.resumebutton = qpushbutton('恢復執行緒', self, clicked=self.onresumethread, enabled=false)

layout.addwidget(self.resumebutton)

self.stopbutton = qpushbutton('終止執行緒', self, clicked=self.onstopthread, enabled=false)

layout.addwidget(self.stopbutton)

# 當前執行緒id

print('main id', int(qthread.currentthreadid()))

# 子執行緒

self._thread = worker(self)

self._thread.finished.connect(self._thread.deletelater)

self._thread.valuechanged.connect(self.progressbar.setvalue)

def onstart(self):

print('main id', int(qthread.currentthreadid()))

self._thread.start() # 啟動執行緒

self.startbutton.setenabled(false)

self.suspendbutton.setenabled(true)

self.stopbutton.setenabled(true)

def onsuspendthread(self):

if self._thread.handle == -1:

return print('handle is wrong')

ret = suspendthread(self._thread.handle)

print('掛起執行緒', self._thread.handle, ret)

self.suspendbutton.setenabled(false)

self.resumebutton.setenabled(true)

def onresumethread(self):

if self._thread.handle == -1:

return print('handle is wrong')

ret = resumethread(self._thread.handle)

print('恢復執行緒', self._thread.handle, ret)

self.suspendbutton.setenabled(true)

self.resumebutton.setenabled(false)

def onstopthread(self):

self.startbutton.setenabled(false)

self.suspendbutton.setenabled(false)

self.resumebutton.setenabled(false)

ret = ctypes.windll.kernel32.terminatethread( # @undefinedvariable

self._thread.handle, 0)

print('終止執行緒', self._thread.handle, ret)

self.stopbutton.setenabled(false)

def closeevent(self, event):

if self._thread.isrunning():

self._thread.quit()

# 強制

# self._thread.terminate()

del self._thread

super(window, self).closeevent(event)

if __name__ == '__main__':

import sys

import os

print('pid', os.getpid())

w = window()

w.show()

並新增建立執行緒的**

self._thread = worker(self) 

self._thread.finished.connect(self._thread.deletelater)

self._thread.valuechanged.connect(self.progressbar.setvalue)

PyQt5中線程掛起終止和喚醒

執行緒的終止問題一直是可比較頭疼的問題,今天找到了乙個比較好的例子,分享給大家 值變化訊號 handle 1 defrun self try 這個目前我沒弄明白這裡寫法 self.handle ctypes.windll.kernel32.openthread undefinedvariable w...

PYQT5 執行緒掛起方法

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

執行緒的掛起,喚醒和終止

如果是利用h afxbeginthread 建立執行緒,需要獲取控制代碼,h m hthread 執行緒的掛起 在createthread 等函式建立執行緒時,可以指定執行緒的掛起狀態,在執行過程中也可以掛起執行緒 dword suspendthread handle hthread hthread...