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

Qt 如何在GUI线程和工作线程之间共享数据?,qt,qthread,Qt,Qthread,我的应用程序是一个简单的消息发送者/接收者,通过TCP/IP和GUI。到目前为止,一切都是一个线程,但我想将TCP/IP通信块和GUI拆分为单独的线程。在我看来,我需要一个共享数据结构(比如QQueue)来在GUI线程和TCP/IP线程之间来回传递消息 问题是:我应该把这个共享数据结构放在哪里?如果我把它放在任何一个线程中,另一个线程如何访问它?O使用QSharedMemory之类的东西更好吗?我个人会创建一个全局单态自旋缓冲区,它是线程之间的共享资源 让“提要线程”(来自TCP/IP线程)将数

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


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

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

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

确保在“put”和“get”上都有适当的锁,以避免竞争条件和死锁


John

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