且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

PySide2 QThread 错误:QThread:线程仍在运行时销毁

更新时间:2022-06-12 20:58:30

说明:

默认情况下,QThread run() 方法具有以下实现:

Explanation:

By default the QThread run() method has the following implementation:

// https://github.com/qt/qtbase/blob/5.14.1/src/corelib/thread/qthread.cpp#L601
void QThread::run()
{
    (void) exec();
}

换句话说,run 方法执行一个事件循环,但是当覆盖该方法时,您将通过 while 循环删除事件循环.

In other words, the run method executes an event loop but when override that method you are removing the event loop by the while loop.

另一方面,如果Qt 文档被审查:

On the other hand if the Qt docs is reviewed:

告诉线程的事件循环退出并返回代码 0(成功).相当于调用 QThread::exit(0).

void QThread::quit()

Tells the thread's event loop to exit with return code 0 (success). Equivalent to calling QThread::exit(0).

如果线程没有事件循环,这个函数什么都不做.

(强调我的)

因此,如果没有事件循环,则退出方法将什么也不做.

So if there is no event loop then the quit method will do nothing.

一个可能的解决方案是使用 isInterruptionRequested()requestInterruption()因为第一个指示标志的状态,第二个改变该标志的状态.另一方面,您必须使用 等待线程完成执行wait() 方法:

A possible solution is to use isInterruptionRequested() and requestInterruption() since the first one indicates the state of the flag and the second one changes the state of that flag. On the other hand you have to wait for the thread to finish executing using the wait() method:

class CustomThread(QtCore.QThread):
    def run(self):
        while not self.isInterruptionRequested():
            print("Thread is Running")
            time.sleep(1)

    def stop(self):
        print("Thread Stopped")
        self.requestInterruption()
        self.wait()