我是Qt的新手,请原谅问题的简单性,但我对Qt线程有点困惑。假设我有3个线程:主要的默认GUI线程,以及我自己创建的2个线程(称为WorkerThread)。我的每个WorkerThread都继承自QThread并且是永久线程,每个线程经常唤醒并将数据发送出套接字并在GUI元素上发布状态。 1)允许GUI线程在WorkerThread线程可以使用的WorkerThread对象中设置数据的最佳方法是什么? 2)允许WorkerThread将状态发送到GUI线程以便为用户显示? 3)允许两个WorkerThreads使用相同的套接字?
从文档中可以看出,当我创建一个WorkerThread对象时,它由创建线程拥有(除了作为新线程的run方法)。那么如何设置新线程的数据来执行呢?新线程使用的所有数据必须是全局的吗?例如,我希望GUI允许用户为唤醒时发送的每个WorkerThreads选择一个数据包类型。我曾假设我会在WorkerThread中放入一些GUI线程会发出信号的插槽。当WorkerThread对象收到SetPacketType的信号时,它将设置run方法在每次迭代时引用的成员变量。但在阅读文档后,我不确定是否可以这样做。如果WorkerThread对象由创建线程拥有(在这种情况下是GUI线程),那么向它发送信号不会跨越线程边界吗?
此外,跨线程共享套接字连接的正确技术是什么?
提前致谢。
答案 0 :(得分:4)
使用Qt,在线程之间发送信息的最简单方法是使用信号和插槽。 Qt自动使用排队信号进行线程之间的连接(参见Qt::ConnectionType),这确保可以从一个线程发出信号,但是插槽将在接收器对象的线程中执行。
如果在线程之间发送的数据(要完成的工作或状态信息)是Qt可以自动排队的东西(例如,QStrings,内置类型,如int和double,以及其他),那么将信息作为信号/槽的参数是发送信息的最佳方式。如果共享大型或复杂数据,则需要使用qRegisterMetaType来允许Qt复制数据,或者将指针传递给线程安全对象。与Pie_Jesu所说的不同,线程确实共享一个地址空间,因此您可以共享指针;只需确保一个线程与共享对象的交互不会干扰另一个线程的交互。
QTcpSocket不是线程安全的(根据Qt的文档,它只是可重入的),所以如果你共享套接字,你必须负责确保线程不会以冲突的方式使用套接字。 / p>