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