Когда я впервые написал приведенный ниже код, у меня не было родительского=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
QThread: уничтожается, пока поток все еще работает - только при использовании QThread(parent=self) ⇐ Python
Программы на Python
1774121532
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
Подробнее: [url]https://stackoverflow.com/questions/79912024/qthread-destroyed-while-thread-is-still-running-only-when-using-qthreadparen[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия