Найти - Пользователи
Полная версия: Не могу разобраться с мультипоточностью
Начало » GUI » Не могу разобраться с мультипоточностью
1
zaxar291
Всем привет, есть програмка, в которую нужно накатить возможность работы функции в отдельном потоке (суть в том, что эта функция работает довольно долго, но при этом должна быть возможность пользоваться остальным приложением). При этом у меня всегда вылеатет ошибка следующего вида:

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()
то приложение будет работать, однако функция работает в том же потоке.
Кто чем сможет помочь?
PEHDOM
zaxar291
Кто чем сможет помочь?
очевидно же что у в вашем потоке есть QObject (его неследник) которому вы пытаетесь установить родителя (метод setParent), но это самый родитель находиться в другом потоке, о чем вам программа честно сообщает. более детально не видя всего кода скзать трудно..
zaxar291
Сам поток пробовал запускать так: threading.Thread…
если уж вы используете PyQt/PySyde почему бы не использовать вместо threading QThread со всеми вытекающими плюшками как то сигналы и слоты?
py.user.next
zaxar291
Кто чем сможет помочь?
Делай вот так
https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/

Надо создать подкласс QObject, потом создать поток, потом у объекта класса вызывать метод выполнения в потоке. И объект, и поток должны быть прикреплены к экземпляру окна. При этом надо всё управление подключить через сигналы.

Части кода со своего проекта
  
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()


tags: pyqt thread
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB