簡體   English   中英

如何殺死正在運行的線程

[英]How to kill a running thread

我有一個對話框顯示正在運行的線程的進度:

from PyQt5.QtWidgets import *
from PyQt5.uic import loadUi
from PyQt5.QtCore import *

class LoaderProgress(QDialog):
    def __init__(self, parent=None):
        super(LoaderProgress, self).__init__(parent)
        loadUi("CliReportsUI/loaderprogress.ui", self)
        self.pbLoader.setValue(0)
        self.btn_cancel.clicked.connect(self.killthread)

    def watchthread(self,worker):
        self.thread = worker(self)
        self.thread.totsignal.connect(self.pbLoader.setMaximum)
        self.thread.cntsignal.connect(self.updateprogress)
        self.thread.finished.connect(self.close)

    def settitle(self,title):
        self.setWindowTitle(title)

    def startthread(self):
        self.thread.start()

    def updateprogress(self,n):
        self.pbLoader.setValue(n)

    def killthread(self):
        print('How do I do this')

另一個 class 中的方法以下列方式運行線程:

    dlg = LoaderProgress(self)
    dlg.watchthread(FileLoader)
    dlg.settitle("Loading The Master File...")
    dlg.show()
    dlg.startthread()

然后是工人class:

class FileLoader(QThread):
    totsignal = pyqtSignal(int)
    cntsignal = pyqtSignal(int)

    def __init__(self,parent=None):
        super(FileLoader, self).__init__(parent)
        self.threadactive = True
        self.total = 100

    def run(self):
        self.totsignal.emit(self.total)
        i = 1
        while(i < self.total and self.threadactive):
            print(time.time)
            if(time.time() % 1==0):
                i+=1
                self.cntsignal.emit(i)

在加載程序對話框上,我有一個取消進程的按鈕(btn_cancel),但如果單擊取消按鈕,我不知道如何終止正在運行的線程。 感謝您的任何幫助。

您必須實現一個stop()方法,該方法將threadactive標志更改為False並使用wait()等待項

class FileLoader(QThread):
    totsignal = pyqtSignal(int)
    cntsignal = pyqtSignal(int)

    def __init__(self,parent=None):
        super(FileLoader, self).__init__(parent)
        self.threadactive = True
        self.total = 100

    def run(self):
        self.totsignal.emit(self.total)
        i = 1
        while(i < self.total and self.threadactive):
            print(time.time())
            if(time.time() % 1==0):
                i+=1
                self.cntsignal.emit(i)

    def stop(self):
        self.threadactive = False
        self.wait()

然后在killthread方法中調用它:

def killthread(self):
    self.thread.stop()
    print('How do I do this')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM