2017-02-08 13 views
-1

Я читал о том, как правильно использовать QThreads, и я немного запутался. Я читал, и многие люди говорили, создают QThread, но также создают рабочего, который является QObject. Затем используйте movetoThread для перемещения Qobject в Qthread.pyqt - Как обеспечить, чтобы все мои вычисления выполнялись в отдельном Qthread?

Я просто немного смущен, так как все примеры, которые я видел в stackoverflow, на самом деле этого не делают.

Если это мой код:

class worker(QThread): 
    def __init__(self): 
     Qthread.__init__(self) 

    def run(self): 
     do_work() 
     a = 3 

    def do_work(self): 
     b = 2 

     self.emit(SIGNAL("work_done"),b) 

class MyApp(QtGui.QMainWindow): 
    QtGui.QMainWindow.__init__(self, parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

     self.worker_thread = worker() 

     self.connect(self.worker,SIGNAL('work_done'),self.done) 

     self.worker_thread.start() 

    def done(self,b) 

     print "the value from the worker is: " + str(b) 

Будет ли этот код делает назначение переменных a и b сделано в другом потоке отдельно от основного потока? Или это не так, поскольку мой объект worker_thread ЖИВЕТ ВНУТРИ основной поток?

ответ

-1

Лучший метод для запуска некоторого кода в другом потоке не относится к подклассу QThread, но для перемещения объекта, реализующего этот другой код, в отдельный поток.

В вашем случае ваш объект worker будет просто наследовать непосредственно от QObject, чтобы вы могли общаться с ним через потоки через сигналы и слоты. Затем создайте стандартный, готовый QThread и переместите worker к нему. Используйте сигналы/слоты для отправки рабочих данных, если это необходимо, и для получения результатов, когда они будут готовы.

Я думаю, что ваша путаница проистекает из этой идеи: QThread объекта управляет отдельным потоком, но сам объект живет в какой-нити создал объект в первую очередь. Например, создание его в основном потоке означает, что QThread также находится в основном потоке, но ваш объект worker будет находиться в потоке, управляемом объектом QThread (после его перемещения туда, конечно).

Отъезд this post для получения более подробной информации и разъяснений.

+0

Сообщение, в котором вы были связаны, устарело, и оно было отменено [QThread: вы не ошибались] (https://woboq.com/blog/qthread-you-were-not-doing-so-wrong .html). Краткое изложение: если в рабочем потоке (который очень часто бывает) не нужен цикл событий в рабочем потоке, просто подкласс 'QThread' и reimplement' run'. – ekhumoro

+0

@ekhumoro Это не устарело, это действительно зависит от того, что вы делаете в отдельной теме. Если вы просто хотите запустить какой-то инкапсулированный код, то подклассом и переопределением 'run()' отлично. Но если вам нужен объект, с которым вы можете общаться, лучше использовать подход, который я здесь даю. – bnaecker

+0

Нет, это действительно устарело. В нем говорится, что официальные документы Qt-потока ошибочны (они больше не существуют), а также заявляют «подклассу [QThread] и реализуют вашу собственную функцию run(), это очень неправильно», что также явно неверно. Пожалуйста, прочитайте другое сообщение в блоге, которое я связал, чтобы понять историю по этому вопросу - это не очень долго, и оно правильно отражает рекомендации, приведенные в текущих документах Qt. – ekhumoro