Форум сайта python.su
0
У меня есть функция, которую пользователь в процессе работы может вызывать несколько раз. При большом объеме входных данных возможно «замораживание» интерфейса. Выход очевиден — вынос обработки в отдельный поток. А т.к. вызовов в процессе работы может быть несколько, то думаю о создании объекта (он будет выполнять обработку) и помещении его в отдельный поток. Т.е. объект живет в потоке, принимает сигнал, выполняет обработку, сигнализирует об успешном выполнении или ошибке и опять ждет сигнал и новые данные.
До этого обычно использовал наследование 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()
Офлайн
0
Т.е workflow должен быть примерно такой:
Офлайн
173
Можно сделать воркера, который в бесконечном цикле будет получать задания из очереди, и слать сигналы о статусе выполнения:
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)
Офлайн