我一直在阅读有关如何正确地"使用QThreads,我变得有点困惑。我一直在阅读,很多人一直在说,创建一个QThread,但也创建了一个QObject的工作者。然后使用movetoThread将Qobject移动到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)
此代码是否会在主线程的另一个线程SEPARATE中完成变量a
和b
的赋值?或者这不是真的,因为我的worker_thread
对象存在于主线程中?
答案 0 :(得分:-1)
在另一个线程中运行某些代码的更好方法不是子类QThread
,而是将实现其他代码的对象移动到一个单独的线程中。
在您的情况下,您的worker
对象将直接从QObject
继承,以便您可以通过信号和插槽跨线程与其进行通信。然后创建一个标准的,开箱即用的QThread
并将worker
移动到它。如果需要,使用信号/插槽发送工作人员数据,并在准备好后检索其结果。
我认为你的困惑源于这个想法:QThread
对象管理一个单独的线程,但对象本身存在于创建该对象的任何线程中第一名。例如,在主线程中创建它意味着QThread
也在主线程中,但是您的worker
对象将位于由QThread
对象管理的线程中(在您移动它之后)当然,那里。)
查看this post了解更多详情和解释。