Форум сайта python.su
2
Пишу c использованием PyQt (Qt 4.7.0, Python 2.6). Задача следующая: есть программа, выполняющая длительную операцию. Чтобы не блокировать интерфейс эту длительную операцию выношу в отдельный поток. Сейчас код обработки выглядит примерно так
class WorkThread( QThread ): def __init__( self, inData, radius, rotate ): QThread.__init__( self, QThread.currentThread() ) self.mutex = QMutex() self.stopMe = 0 def run( self ): self.mutex.lock() self.stopMe = 0 self.mutex.unlock() interrupted = False for i in inData: # что-то делаем self.emit( SIGNAL( "updateProgress()" ) ) self.mutex.lock() s = self.stopMe self.mutex.unlock() if s == 1: interrupted = True break if not interrupted: self.emit( SIGNAL( "processFinished()" ) ) else: self.emit( SIGNAL( "processInterrupted()" ) ) def stop( self ): self.mutex.lock() self.stopMe = 1 self.mutex.unlock() QThread.wait( self )
self.myThread = WorkThread( myData, myRadius, False ) QObject.connect( self.workThread, SIGNAL( "updateProgress()" ), self.updateProgress ) QObject.connect( self.workThread, SIGNAL( "processFinished()" ), self.processFinished ) QObject.connect( self.workThread, SIGNAL( "processInterrupted()" ), self.processInterrupted ) self.workThread.start()
Офлайн
173
Вот здесь более подробно: http://qt-project.org/wiki/Threads_Events_QObjects
Ничего особо плохого в наследовании QThread я не вижу, особенно если DOs and DON'Ts соблюдаются.
Вариант с созданием Worker'a унаследованного от QObject и потом worker.moveToThread(thread), как мне кажется, дает возможность разделения логики управления потоками и собственно самой работы. Тут надо смотреть уже, что удобнее.
P.S. Давно уже пора переходить на New-style Signal and Slot
class A(QThread): updateProgress = QtCore.pyqtSignal() ... def f(sefl): self.updateProgress.emit() ... self.workThread.updateProgress.connect(self.updateProgress) ...
Отредактировано reclosedev (Май 12, 2012 17:31:01)
Офлайн
2
Спасибо. Статью бегло просмотрел, вроде бы все хорошо. На досуге еще почитаю внимательнее.
Насчет нового стиля сигналов-слотов. Какой-то он не очень читаемый (ИМХО) да и в проекте везде QObject.connect(). Если менять, то менять во всем проекте, а файлов там не 5 и не 10.
Офлайн
568
voltronА Вы в существующем проекте и не меняйте, пусть как есть, так и будет (работает - не трожь!)
Спасибо. Статью бегло просмотрел, вроде бы все хорошо. На досуге еще почитаю внимательнее.
Насчет нового стиля сигналов-слотов. Какой-то он не очень читаемый (ИМХО) да и в проекте везде QObject.connect(). Если менять, то менять во всем проекте, а файлов там не 5 и не 10.
Офлайн