QThread: уничтожается, пока поток все еще работает - только при использовании QThread(parent=self)Python

Программы на Python
Ответить
Anonymous
 QThread: уничтожается, пока поток все еще работает - только при использовании QThread(parent=self)

Сообщение Anonymous »

Когда я впервые написал приведенный ниже код, у меня не было родительского=self в self.worker_thread = QThread(), он работал нормально, но если бы я нажал кнопку «Пуск» во второй раз после того, как рабочий процесс завершился или был остановлен, я бы получил QThread: Destroyed, пока поток все еще работает.
После быстрого поиска в Google я добавил родительский=self и могу запускать и останавливать его столько раз, сколько мне нравится, без ошибок, но теперь я получаю ошибку при закрытии окна (после того, как рабочий завершился или был остановлен). Я не всегда получаю эту ошибку, но в 99% случаев я не могу понять, что ее вызывает.
Я вообще не получаю ошибку, если удаляю родительский=self (но, конечно, я не могу запустить Worker во второй раз).
import time
from PyQt6.QtCore import Qt, QObject, pyqtSignal, QThread
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPlainTextEdit, QPushButton

class MyWindow(QWidget):
def __init__(self):
super().__init__()

vbox = QVBoxLayout(self)

self.progress_box = QPlainTextEdit()
self.progress_box.setFixedHeight(100)

self.start_btn = QPushButton("Start")
self.stop_btn = QPushButton("Stop")
self.start_btn.clicked.connect(self.start_worker)
self.stop_btn.clicked.connect(self.stop_worker)

self.stop_btn.setVisible(False)

vbox.addWidget(self.progress_box)
vbox.addWidget(self.start_btn, alignment=Qt.AlignmentFlag.AlignCenter)
vbox.addWidget(self.stop_btn, alignment=Qt.AlignmentFlag.AlignCenter)

def start_worker(self):
self.progress_box.appendPlainText("Starting")

self.worker_thread = QThread(parent=self)

self.worker = Worker(1, 10, 0.5)
self.worker.moveToThread(self.worker_thread)
self.worker.progress.connect(self.update_progress)
self.worker.finished.connect(self.finished)

self.worker_thread.started.connect(self.worker.do_work)
self.worker_thread.start()

self.start_btn.setVisible(False)
self.stop_btn.setVisible(True)

def stop_worker(self):
self.worker.stop.emit()

def update_progress(self, i):
self.progress_box.appendPlainText(str(i))

def finished(self):
self.progress_box.appendPlainText("Finished")

self.start_btn.setVisible(True)
self.stop_btn.setVisible(False)

class Worker(QObject):
finished = pyqtSignal()
progress = pyqtSignal(int)
stop = pyqtSignal()

def __init__(self, start_num, end_num, delay):
super().__init__()

self.start_num = start_num
self.end_num = end_num
self.delay = delay
self.stop_requested = False

self.stop.connect(self.request_stop)

def do_work(self):
i = self.start_num

while i

Подробнее: https://stackoverflow.com/questions/799 ... hreadparen
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»