我是 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::连接类型),这确保了信号可以从一个线程发出,但槽将在接收者对象的线程中执行。
如果线程之间发送的数据(待完成的工作或状态信息)是 Qt 可以自动排队的数据(例如,QString、int 和 double 等内置类型),则将信息作为参数传递给信号/槽是发送信息的最佳方式。如果正在共享大型或复杂的数据,那么您需要使用qRegisterMetaType允许 Qt 复制数据,或传递指向线程安全对象的指针。与 Pie_Jesu 所说的不同,线程确实共享地址空间,因此您可以共享指针;只需确保一个线程与共享对象的交互不会干扰另一线程的交互。
QTcpSocket不是线程安全的(根据 Qt 的文档,它只是可重入的),因此如果您共享套接字,您将必须负责确保线程不会以冲突的方式使用套接字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)