Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 28, 2013 15:22:52

_alexs_
Зарегистрирован: 2012-04-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt. Многократное выполнение действий в потоке

У меня есть функция, которую пользователь в процессе работы может вызывать несколько раз. При большом объеме входных данных возможно «замораживание» интерфейса. Выход очевиден — вынос обработки в отдельный поток. А т.к. вызовов в процессе работы может быть несколько, то думаю о создании объекта (он будет выполнять обработку) и помещении его в отдельный поток. Т.е. объект живет в потоке, принимает сигнал, выполняет обработку, сигнализирует об успешном выполнении или ошибке и опять ждет сигнал и новые данные.

До этого обычно использовал наследование QThread и переопределение метода run(), что-то похожее описано в этой теме. Соответственно, как реализовать описанное выше не очень понятно. Пока додумался только до вот такого: создание объекта и потока при каждом нажатии на кнопку

self.thread = QThread()
self.worker = MyWorker()
self.worker.moveToThread(self.thread)
self.worker.setData(arg1, agr2) # передаём данные
self.thread.started.connect(self.worker.processData)
self.worker.updateProgress.connect(self.showProgress)
self.worker.finished.connect(self.logMessage)
self.worker.finished.connect(self.thread.quit)
self.worker.finished.connect(self.worker.deleteLater)
self.thread.finished.connect(self.thread.deleteLater)
self.thread.start()
Насколько это правильно? Можно ли всё же как-то обойтись одним объектом? Небольшой пример будет очень кстати.

Офлайн

#2 Окт. 28, 2013 19:08:46

_alexs_
Зарегистрирован: 2012-04-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt. Многократное выполнение действий в потоке

Т.е workflow должен быть примерно такой:

  • создаётся поток и объект-worker, объект помещается в поток. Поток запускается, но ничего не делает.
  • пользователь жмет кнопку
  • worker пробуждается, обрабатывает данные и опять засыпает до следующего нажатия кнопки

Офлайн

#3 Окт. 29, 2013 19:16:55

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt. Многократное выполнение действий в потоке

Можно сделать воркера, который в бесконечном цикле будет получать задания из очереди, и слать сигналы о статусе выполнения:

from Queue import Queue
from PyQt4 import QtCore
 
STOP = object()
 
class WorkerThread(QtCore.QThread):
     
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self, parent)
        self._con = None
        self._queue = Queue()
 
    def add_task(self, task):
         self._queue.put(task)
 
    def stop(self):
         self._queue.put(STOP)
 
    def run(self):
        while True:
            task = self._queue.get()
            if task is STOP:
                 # send some status
                 break
            self.process_data(task)
            self.some_signal.emit("some message")

Отредактировано reclosedev (Окт. 29, 2013 19:17:19)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version