1

所以我试图编写一个需要可变数量线程的 qt 应用程序。我将使用在创建类之前用于线程的方法,然后在该对象上使用 moveToThread 函数。但是这一次我将有一个 QObjects 数组,并且我会将每个 QObjects 移动到一个单独的线程中。

我的问题是:从该数组发送一个元素到另一个线程中会破坏数组,还是它仍然可以正常运行?我只是不知道将对象移动到另一个线程是否真的在内存中移动。

作为记录,在其他人的建议下,我找到了一种仅使用 2 个线程而不是变量编号来制作应用程序的方法。但我仍然想知道这将如何工作。

4

3 回答 3

1

将 QObject 移动到不同的线程不会以任何方式在内存中移动。所以不,我不会破坏你的阵列。

将 QObject 移动到不同线程的作用是改变了它的线程亲缘关系。主要影响涉及事件处理——发送到对象的事件由对象线程的事件循环处理。如果对象的线程没有运行事件循环,它就不会得到任何事件。

请注意,通过父/子关系创建的完整 QObject 树需要存在于同一个线程中。另外,对象需要从对象的线程中删除。

回到你的数组:你的数组不会因为将它的 QObjects 移动到另一个线程而被破坏——但是,如果你真的想从主线程访问数组中的任何 QObject,你必须非常小心——你需要适当的锁定和互斥锁防止竞争条件,因为 QObject 不是线程安全的。

所以数组本身很好,但是如果没有适当的锁定,你实际上不能使用其中的 QObjects。

于 2013-06-27T20:44:46.870 回答
1

它不会破坏数组,因为不涉及内存移动。但是将 QObject 移动到另一个线程会使另一个线程负责删除它(QObject 是可重入的,而不是线程安全的!),因此不要尝试通过qDeleteAll“主”线程或类似方式删除该数组中的对象。

于 2013-06-27T20:45:13.323 回答
0

通常,Qt 的设计模式是让对象在它们应该在其中工作的线程中完成工作,然后使用线程安全的信号/插槽与它们/彼此通信。我认为您应该“尽量避免”通过例如数组直接与您的工作人员进行通信。

但是,正如其他人所说,这样做不应该破坏数组 - 尽管正如其他人所提到的,只是不要尝试删除对象(更多信息:http: //qt-project.org/doc/qt-4.8 /threads-qobject.html)。

于 2013-06-27T20:46:33.763 回答