Найти - Пользователи
Полная версия: QThread: как правильно?
Начало » Python для новичков » QThread: как правильно?
1
voltron
Пишу 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()
Все работает, но терзают смутные сомнения насколько это правильно. В частности здесь написано, что такой подход не совсем правильный
reclosedev
Вот здесь более подробно: 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)
...
voltron
Спасибо. Статью бегло просмотрел, вроде бы все хорошо. На досуге еще почитаю внимательнее.

Насчет нового стиля сигналов-слотов. Какой-то он не очень читаемый (ИМХО) да и в проекте везде QObject.connect(). Если менять, то менять во всем проекте, а файлов там не 5 и не 10.
FishHook
voltron
Спасибо. Статью бегло просмотрел, вроде бы все хорошо. На досуге еще почитаю внимательнее.

Насчет нового стиля сигналов-слотов. Какой-то он не очень читаемый (ИМХО) да и в проекте везде QObject.connect(). Если менять, то менять во всем проекте, а файлов там не 5 и не 10.
А Вы в существующем проекте и не меняйте, пусть как есть, так и будет (работает - не трожь!)
Но новонаписанный код удобнее строить именно на нью-стайл-сигналз. Это ИМХО.
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