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

До этого обычно использовал наследование 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()
Насколько это правильно? Можно ли всё же как-то обойтись одним объектом? Небольшой пример будет очень кстати.
_alexs_
Т.е workflow должен быть примерно такой:
  • создаётся поток и объект-worker, объект помещается в поток. Поток запускается, но ничего не делает.
  • пользователь жмет кнопку
  • worker пробуждается, обрабатывает данные и опять засыпает до следующего нажатия кнопки
reclosedev
Можно сделать воркера, который в бесконечном цикле будет получать задания из очереди, и слать сигналы о статусе выполнения:
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")
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