【问题标题】:how to terminate qthread in python如何在python中终止qthread
【发布时间】:2015-01-06 02:59:42
【问题描述】:

我有 GUI 应用程序,它使用 qwebview 通过长循环进行网络自动化过程,所以我使用 QThread 来执行此操作,但我无法终止线程,我的代码如下

class Main(QMainWindow):
    def btStart(self):
        self.mythread = BrowserThread()
        self.connect(self.mythread, SIGNAL('loop()'), self.campaign_loop, Qt.AutoConnection)
        self.mythread.start()

    def btStop(self):
        self.mythread.terminate()

    def campaign_loop(self):
        loop goes here

class BrowserThread(QThread):
    def __init__(self):
        QThread.__init__(self)

    def run(self):
        self.emit(SIGNAL('loop()'))

这段代码在启动线程时工作正常,但无法停止循环,浏览器仍在运行,即使我调用它的关闭事件并且它从 GUI 中消失

【问题讨论】:

    标签: python pyside qthread terminate


    【解决方案1】:

    编辑:它也适用于 linux,我在 raspberry pi 4 上试过,效果很好

    关键是在“run”方法中创建主循环,因为“terminate”函数在“run”中停止循环而不是线程自身 这是一个工作示例,但不幸的是它仅适用于 Windows

    import sys
    import time
    from PySide.QtGui import *
    from PySide.QtCore import *
    
    class frmMain(QDialog):
        def __init__(self):
            QDialog.__init__(self)
            self.btStart = QPushButton('Start')
            self.btStop = QPushButton('Stop')
            self.counter = QSpinBox()
            self.layout = QVBoxLayout()
            self.layout.addWidget(self.btStart)
            self.layout.addWidget(self.btStop)
            self.layout.addWidget(self.counter)
            self.setLayout(self.layout)
            self.btStart.clicked.connect(self.start_thread)
            self.btStop.clicked.connect(self.stop_thread)
    
        def stop_thread(self):
            self.th.stop()
    
        def loopfunction(self, x):
            self.counter.setValue(x)
    
        def start_thread(self):
            self.th = thread(2)
            #self.connect(self.th, SIGNAL('loop()'), lambda x=2: self.loopfunction(x), Qt.AutoConnection)
            self.th.loop.connect(self.loopfunction)
            self.th.setTerminationEnabled(True)
            self.th.start()
    
    class thread(QThread):
        loop = Signal(object)
    
        def __init__(self, x):
            QThread.__init__(self)
            self.x = x
    
        def run(self):
            for i in range(100):
                self.x = i
                self.loop.emit(self.x)
                time.sleep(0.5)
    
        def stop(self):
            self.terminate()
    
    
    app = QApplication(sys.argv)
    win = frmMain()
    
    win.show()
    sys.exit(app.exec_())
    

    【讨论】:

    猜你喜欢
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2013-11-10
    • 2015-09-08
    • 2020-03-12
    • 2019-10-05
    相关资源
    最近更新 更多