Объяснение:
По умолчанию метод QThread run () имеет следующую реализацию:
// https://github.com/qt/qtbase/blob/5.14.1/src/corelib/thread/qthread.cpp#L601
void QThread::run()
{
(void) exec();
}
Другими словами, метод run выполняет событие l oop, но при переопределении тем методом, которым вы удаляете событие l oop, в то время как l oop.
С другой стороны, если пересмотрен Qt docs :
void QThread :: quit ()
Сообщает событию потока l oop о выходе с кодом возврата 0 (успех). Эквивалентно вызову QThread :: exit (0).
Эта функция ничего не делает, если у потока нет события l oop.
(выделено мной)
Таким образом, если событие l oop отсутствует, метод quit ничего не даст.
Решение:
Возможное решение должен использовать isInterruptionRequested()
и requestInterruption()
, поскольку первый указывает состояние флага, а второй изменяет состояние этого флага. С другой стороны, вам нужно дождаться завершения потока sh, используя метод wait()
:
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()