Qt的跨线程共享数据(Sharing data across Qt threads)

2019-06-28 04:45发布

我是新来的Qt,所以请原谅这个问题的简单,但我对Qt的线程有点混乱。 比方说,我有3个线程:主默认GUI线程,和2个线程我自己的创作(被称为的WorkerThread)的。 我的每一个WorkerThreads从继承的QThread而且必须是永久线程,每隔一段时间醒来并发送GUI元素上了插座和后状态数据。 1最好的办法)如何使GUI线程在的WorkerThread对象的线程的WorkerThread可以用一组数据? 2)允许的WorkerThread发送状态到GUI线程要被显示给用户? 3)允许两个WorkerThreads使用相同插座?

它从文档看来,当我创建的WorkerThread对象是通过创建线程拥有的(除了是一个新的线程的run方法)。 那么,如何一组数据对新的线程来执行呢? 必须将所有数据的新线程使用是全球性的? 举例来说,我想在GUI允许用户选择包类型为每个WorkerThreads的,当他们醒来时发送。 我曾以为我会放一些插槽中的WorkerThread的GUI线程将发出信号。 当的WorkerThread对象接收到的信号,以SetPacketType它会设置一个成员变量在每次迭代运行方法的引用。 但阅读文档后,我不知道那是做它的方式。 如果的WorkerThread对象被创建线程(GUI线程在这种情况下)拥有然后将信号发送到它不跨线程边界不是吗?

此外,什么是共享在线程之间的套接字连接的正确方法?

提前致谢。

Answer 1:

有了Qt,在线程之间发送信息的最简单的方法是使用信号和槽。 Qt的自动使用线程之间的连接队列信号(见Qt的:: ConnectionType ),这保证了一个信号可以从一个线程被发射,但所述槽将在接收器对象的线程来执行。

如果线程之间发送的数据(将要执行的工作或状态信息)的东西,Qt可以自动排队(例如,将QString,内置类型,如int和double,等等),然后传递信息作为参数传递给信号/槽是发送信息的最佳途径。 如果大型或复杂的数据被共享,那么您可能需要使用qRegisterMetaType允许Qt的一个指针复制数据,或传递给一个线程安全的对象。 不像什么Pie_Jesu说,线程做共享一个地址空间,这样你就可以分享指针; 只是确保一个线程与共享对象的交互不会与另一个线程的交互干扰。

与QTcpSocket不是线程安全的(它只是根据Qt的文档重入),所以如果你分享,你将必须负责确保线程不冲突的方式来使用插座的插口。



文章来源: Sharing data across Qt threads
标签: qt qthread