Уведомления

Группа в Telegram: @pythonsu

#1 Май 12, 2012 15:57:53

voltron
От:
Зарегистрирован: 2009-04-23
Сообщения: 31
Репутация: +  2  -
Профиль   Отправить e-mail  

QThread: как правильно?

Пишу 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()
Все работает, но терзают смутные сомнения насколько это правильно. В частности здесь написано, что такой подход не совсем правильный



Офлайн

#2 Май 12, 2012 17:25:55

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

QThread: как правильно?

Вот здесь более подробно: 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)

Офлайн

#3 Май 12, 2012 18:33:35

voltron
От:
Зарегистрирован: 2009-04-23
Сообщения: 31
Репутация: +  2  -
Профиль   Отправить e-mail  

QThread: как правильно?

Спасибо. Статью бегло просмотрел, вроде бы все хорошо. На досуге еще почитаю внимательнее.

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



Офлайн

#4 Май 13, 2012 16:20:31

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

QThread: как правильно?

voltron
Спасибо. Статью бегло просмотрел, вроде бы все хорошо. На досуге еще почитаю внимательнее.

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



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version