gpt4 book ai didi

c++ - 在 QAbstractTableModel 中使用多个线程之间共享的数据

转载 作者:行者123 更新时间:2023-11-30 03:45:45 24 4
gpt4 key购买 nike

我有一个使用 Q_GLOBAL_STATIC 实现的单例类,它包含一个必须从多个线程访问的数据结构,我在类中实现了访问器函数,它会在访问数据之前锁定互斥量,这样所有对共享数据的访问都是序列化的。

问题是我想在 QAbstractTableModel 中使用这些数据,我可以简单地使用我实现的访问器函数并从我覆盖的 data()< 一次访问一个项目columnCount()rowCount()。但我认为这是不够的,因为在对 data() 的两次后续调用之间,另一个线程可能会跳入并更改项目数,例如 (rowCount()),并且模型的线程最终可能会访问越界数据。

我想我需要在第一次调用模型重置的 columnCount()rowCount() 之前锁定互斥量,并且只有在所有数据都出现时才解锁它被读入模型(在最后一次调用 data() 之后),有没有办法这样做?还是我想错了?

我想在模型重置时将共享数据结构复制到本地数据结构(并且只在复制操作时锁定互斥锁),然后安全地访问复制的数据,但这不是矫枉过正吗?有没有更有效的解决方案?

最佳答案

在 Qt 的模型- View 框架中,QAbstractItemModel 和 QAbstractItemView 之间的接口(interface)根本不是线程安全的,它被设计为只能与一个线程一起使用,该线程必须是 GUI 线程,即主线程,因为 View 在GUI,这不能在主 (GUI) 线程之外的另一个线程中安全地完成。

因此,模型必须拥有自己的数据并将其与真实数据同步。如果您的数据集很大,您可以依靠 fetchMore() 来避免在每个模型实例中复制整个数据。看看在 QtSql's sql models code 中做了什么.那么您提出的调用间锁定问题就更容易解决。

如果真实的数据持有者对象能够发出连接到模型实例的信号,您甚至可以以事件驱动的方式更新模型。由于自动/排队信号连接,模型插槽将在主 (GUI) 线程中执行,因此不需要线程安全的 QAbstractItemModel-QAbstractItemView 接口(interface)。

关于c++ - 在 QAbstractTableModel 中使用多个线程之间共享的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34562851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com