![](/img/trans.png)
[英]How to structure large pyqt5 GUI without subclassing QThread and using QPushButtons to do long-running tasks
[英]pyqt - How do I ensure that all my calculations are running in a separate Qthread?
我一直在阅读有关如何“正确”使用 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)
这段代码会使变量a
和b
的分配在与主线程分离的另一个线程中完成吗? 或者这不是真的,因为我的worker_thread
对象存在于主线程中?
在另一个线程中运行某些代码的更好方法不是将QThread
子类化,而是将实现该其他代码的对象移动到单独的线程中。
在您的情况下,您的worker
对象将直接从QObject
继承,以便您可以通过信号和插槽跨线程与其通信。 然后创建一个标准的、开箱即用的QThread
并将worker
QThread
移动到它。 如果需要,使用信号/插槽发送工作数据,并在它们准备好时检索其结果。
我认为你的困惑源于这个想法: QThread
对象管理一个单独的线程,但对象本身存在于首先创建对象的任何线程中。 例如,在主线程中创建它意味着QThread
也在主线程中,但是您的worker
对象将在QThread
对象管理的线程中(当然,在您将其移动到那里之后)。
查看此帖子以获取更多详细信息和解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.