如何在 GUI 线程和工作线程之间共享数据?

Posted

技术标签:

【中文标题】如何在 GUI 线程和工作线程之间共享数据?【英文标题】:How do I share data between a GUI thread and a worker thread? 【发布时间】:2013-05-03 17:55:16 【问题描述】:

我的应用程序是一个简单的消息发送方/接收方,通过 TCP/IP 和 GUI。到目前为止,一切都是一个单一的线程,但我想将 TCP/IP 通信块和 GUI 拆分为单独的线程。如我所见,我需要一个共享数据结构(如 QQueue)在 GUI 线程和 TCP/IP 线程之间来回传递消息。

问题是:我应该把这个共享数据结构放在哪里?如果我把它放在任何一个线程中,另一个线程如何访问它? O 使用 QSharedMemory 之类的东西更好吗?

【问题讨论】:

您应该使用 Qt 的槽和信号机制在 GUI 线程和工作线程之间共享数据。 Seconded...如果您必须发出信号表明新数据仍然可用(似乎很可能),那么只需使用信号本身来传递数据。如果您不想复制太多数据,那么可能会转而使用 QMutex 来控制对共享列表或队列的访问。 Sharing data across Qt threads 的可能重复项 @darron: 是的,我会使用带有 QMutex 的队列,但我怀疑在哪里声明它:如果我在一个线程上声明它,另一个线程可以访问它吗? @alexrc 函数和类实例的数据成员等完全可以从其他线程使用...这就是为什么您需要 QMutex 来防止在尝试更改内容时可能发生的坏事同时。如果他们有彼此的指针,他们可以做任何他们喜欢的事情。只需将您需要的内容添加到线程类中,并为其他线程提供公共访问器来调用它们。 【参考方案1】:

我会亲自创建一个全局单例自旋缓冲区,它是线程之间的共享资源。

让“馈送线程”(来自您的 TCP/IP 线程)将数据放入缓冲区。 让您的“读取线程”(从您的 GUI)从缓冲区中提取数据。

确保在“puts”和“gets”上都有正确的锁,以避免竞争条件和死锁。

约翰

【讨论】:

以上是关于如何在 GUI 线程和工作线程之间共享数据?的主要内容,如果未能解决你的问题,请参考以下文章

Java 线程系列Java线程之间的共享和协作

在 cuda 线程之间共享大量常量数据

并发编程之线程共享和协作

如何在两个线程之间共享数据

并发-线程基础线程共享和协作

在主线程和线程之间共享一个变量