Форум сайта python.su
Всем привет, есть програмка, в которую нужно накатить возможность работы функции в отдельном потоке (суть в том, что эта функция работает довольно долго, но при этом должна быть возможность пользоваться остальным приложением). При этом у меня всегда вылеатет ошибка следующего вида:
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QBasicTimer::start: Timers cannot be started from another thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QBasicTimer::start: Timers cannot be started from another thread
Сам поток пробовал запускать так:
threading.Thread(target=self._do_import_thread, args=(title, header_layout, func)).start()
threading.Thread(target=self._do_import_thread(title, header_layout, func)).start()
Офлайн
zaxar291очевидно же что у в вашем потоке есть QObject (его неследник) которому вы пытаетесь установить родителя (метод setParent), но это самый родитель находиться в другом потоке, о чем вам программа честно сообщает. более детально не видя всего кода скзать трудно..
Кто чем сможет помочь?
zaxar291если уж вы используете PyQt/PySyde почему бы не использовать вместо threading QThread со всеми вытекающими плюшками как то сигналы и слоты?
Сам поток пробовал запускать так: threading.Thread…
[code python][/code]
Отредактировано PEHDOM (Ноя. 7, 2018 21:06:07)
Офлайн
zaxar291Делай вот так
Кто чем сможет помочь?
from PyQt5.QtCore import QObject from PyQt5.QtCore import pyqtSignal from PyQt5.QtCore import QThread from PyQt5.QtCore import QTimer
def onScanButtonClicked(self): self.thread = QThread(self) self.worker = ScanTask() thread = self.thread worker = self.worker worker.moveToThread(thread) worker.message[str].connect(self.onScanTaskMessageSignal) thread.started.connect(worker.process) worker.finished.connect(thread.quit) worker.finished.connect(worker.deleteLater) thread.finished.connect(thread.deleteLater) thread.start() def onScanTaskMessageSignal(self, text): self.textLog.append(text)
class ScanTask(QObject): message = pyqtSignal(str) finished = pyqtSignal() def process(self): self.timer = QTimer() self.nticks = 1 self.maxticks = 10 self.timer.timeout.connect(self.onTimeout) self.timer.start(500) def onTimeout(self): self.message.emit('Tick #' + str(self.nticks)) if self.nticks < self.maxticks: self.nticks += 1 else: self.timer.stop() self.finished.emit()
Отредактировано py.user.next (Апрель 26, 2021 11:24:57)
Офлайн