![]() |
1
31
我唯一想补充的是
这样就省去了子类
那篇博文包含了一个指向
example
如果必须在该机制之外调用对象上的方法,则可能必须引入同步。 我知道Qt还有其他好东西 threading facilities 除了可能值得熟悉的线程之外,我还没有这样做:) |
![]() |
2
9
这是 one example of how to use QThread correctly ,但它也有一些问题,这些问题反映在评论中。特别是,由于插槽的执行顺序没有严格定义,因此可能会导致各种问题。2013年8月6日发表的评论给出了一个如何处理这个问题的好主意。我在程序中使用了类似的方法,下面是一些示例代码。
一些背景: childprocesss类是一个子进程管理器,它使用spawn()调用启动新的子进程,保持当前运行的进程列表,等等。但是,它需要跟踪子状态,这意味着在Linux上使用waitpid()调用或在Windows上使用WaitForMultipleObjects。我以前用定时器在非阻塞模式下调用它们,但现在我需要更迅速的反应,这意味着阻塞模式。这就是线索的来源。 ChildrenWatcher类定义如下:
这就是它的工作原理。当所有这些东西都启动时,调用ChildProcess::start()方法(见上文)。它创建一个新的QThread和一个新的ChildrenWatcher,然后将其移动到新线程。然后,我连接三个信号,通知我的经理关于其子进程的命运(退出/信号/上帝知道发生了什么)。然后开始主要的乐趣。 我将QThread::started()连接到ChildrenWatcher::watch()方法,以便在线程准备好后立即启动它。由于watcher位于新线程中,因此watch()方法在该线程中执行(队列连接用于调用插槽)。 然后,我使用Qt::DirectConnection将ChildProcesses::stopped()信号连接到ChildrenWatcher::stop()插槽,因为我需要异步连接。这是必需的,因此当不再需要childprocesss管理器时,我的线程将停止。stop()方法如下:
然后ChildrenWatcher::watch():
噢,issTop()方法只是在while()条件下使用互斥量的一种方便方法:
那么watch()循环结束时会发生什么?它调用deleteLater(),这样当控件返回到线程事件循环时,对象就会自毁,而线程事件循环正好发生在deleteLater()调用之后(watch()返回时)。返回ChildProcesses::start(),您可以看到从监视程序的destroyed()信号到线程的quit()插槽之间存在连接。这意味着线程将在观察程序完成时自动完成。当它完成时,它也会自毁,因为它自己的finished()信号连接到它的deleteLater()插槽。 这与Maya发布的想法几乎相同,但因为我使用自毁习惯用法,所以不需要依赖于调用插槽的顺序。它总是先自毁,稍后停止线程,然后也自毁。我可以在工作进程中定义finished()信号,然后将其连接到自己的deleteLater(),但这只意味着多了一个连接。由于我不需要finished()信号用于任何其他目的,所以我选择只从工作进程本身调用deleteLater()。 Maya还提到不应该在worker的构造函数中分配新的qobject,因为它们不会存在于将worker移动到的线程中。我说无论如何都要做,因为OOP就是这样工作的。只需确保所有这些QObject都是worker的子对象(即,使用QObject(QObject*)构造函数)-moveToThread()将所有子对象与要移动的对象一起移动。如果您真的需要QObjects不是对象的子对象,那么在工作线程中重写moveToThread(),以便它也移动所有必要的内容。 |
![]() |
3
3
|
![]() |
4
2
子类化qthread类仍将在原始线程中运行代码。我想在已经使用GUI线程(主线程)的应用程序中运行一个udp侦听器,当udp侦听器工作正常时,GUI被子类qthread事件处理程序阻塞而冻结。我认为g19发烧友发布的内容是正确的,但是您还需要工作线程来成功地将对象迁移到新线程。我发现 this 文章详细描述了QT中线程的Do和don's。 在决定子类QThread之前必须阅读! |
![]() |
5
0
|
![]() |
Sijith · 在运行过程中删除Qthread 7 年前 |
|
gevirus · QThread窗口没有响应 7 年前 |
![]() |
JaredL · PySide插槽未在对象的线程中运行 8 年前 |
![]() |
alphanumeric · 如何从QThread调用小部件的方法 9 年前 |
![]() |
Marek · QThread:当线程仍在Python中运行时被销毁 9 年前 |
![]() |
The Man · QThread:线程仍在运行时已销毁? 11 年前 |