Уведомления

Группа в Telegram: присоединиться
  • Начало
  • » GUI
  • » Не могу разобраться с мультипоточностью [RSS Feed]

#1 Ноя. 7, 2018 19:23:40

zaxar291
Зарегистрирован: 2018-11-07
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться с мультипоточностью

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

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()
то приложение будет работать, однако функция работает в том же потоке.
Кто чем сможет помочь?

Офлайн

#2 Ноя. 7, 2018 21:05:29

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 943
Репутация: +  163  -
Профиль   Отправить e-mail  

Не могу разобраться с мультипоточностью

zaxar291
Кто чем сможет помочь?
очевидно же что у в вашем потоке есть QObject (его неследник) которому вы пытаетесь установить родителя (метод setParent), но это самый родитель находиться в другом потоке, о чем вам программа честно сообщает. более детально не видя всего кода скзать трудно..
zaxar291
Сам поток пробовал запускать так: threading.Thread…
если уж вы используете PyQt/PySyde почему бы не использовать вместо threading QThread со всеми вытекающими плюшками как то сигналы и слоты?

Отредактировано PEHDOM (Ноя. 7, 2018 21:06:07)

Офлайн

#3 Ноя. 8, 2018 00:18:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 5947
Репутация: +  538  -
Профиль   Отправить e-mail  

Не могу разобраться с мультипоточностью

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



Отредактировано py.user.next (Ноя. 9, 2018 04:32:23)

Офлайн

  • Начало
  • » GUI
  • » Не могу разобраться с мультипоточностью[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version