代码之家  ›  专栏  ›  技术社区  ›  pippo1980

PyQt5 QThread.self.setTerminationEnabled(False)似乎不起作用

  •  0
  • pippo1980  · 技术社区  · 2 年前

    借款自 PySide QThread.terminate() causing fatal python error 我试过这个例子:

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Looper(QtCore.QThread):
        """QThread that prints natural numbers, one by one to stdout."""
        def __init__(self, *args, **kwargs):
            super(Looper, self).__init__(*args, **kwargs)
            # self.setTerminationEnabled(True)
            
            self.setTerminationEnabled(False)
    
        def run(self):
            i = 0
            while True:
                self.msleep(100)
                print(i)
                i += 1
    
    # Initialize and start a looper.                                                                      
    looper = Looper()
    
    looper.setTerminationEnabled(False)
    looper.start()
    
    # Sleep main thread for 5 seconds.                                                                    
    QtCore.QThread.sleep(3)
    
    # Terminate looper.                                                                                   
    looper.terminate()
    
    app = QtWidgets.QApplication([])
    app.exec_()
    

    我可能错了,但意料之中 looper.setTerminationEnabled(False) self.setTerminationEnabled(False) 以防止QThread terminate() 根据 https://doc.qt.io/qtforpython-6/PySide6/QtCore/QThread.html#PySide6.QtCore.PySide6.QtCore.QThread.setTerminationEnabled

    但对我来说,这行不通。有什么提示吗??

    我正在使用 Qt: v 5.15.2 PyQt: v 5.15.7

    1 回复  |  直到 2 年前
        1
  •  2
  •   user2357112    2 年前

    setTerminationEnabled 是一种静态方法。它不会启用或禁用被调用线程的终止,事实上,您根本不应该在QThread实例上调用它。

    setTerminationEnabled 启用或禁用的终止 调用的线程 setTerminationEnabled 。你需要从 looper 线不,把它放进去 __init__ 不这么做- __初始化__ 不由新线程执行。这条线索甚至还没有开始。你需要打电话给它 run :

    def run(self):
        QTCore.QThread.setTerminationEnabled(False)
        ...