如何在Qt模型/视图设置中同步访问从多个线程访问的数据?
我正在使用QTableView
Model
类。
Model
扩展了QAbstractTableModel
并拥有自定义类Net
的实例,该实例保存通过QTableView
调用显示到data()
的实际数据(由Model::data()
)
我的类侦听网络数据并在单独的线程上运行,从中更新它的数据(10个字符串的简单固定大小数组)。
我的类中的数据必须由不断更新它的线程访问,并通过调用data()
上的Model
从Qt GUI访问。
我认为我需要使用互斥锁来同步对我的字符串数组的访问,但QAbstractTableModel::data()
是const
方法,所以我无法锁定boost::mutex
。
用于同步对QAbstractTableModel
扩展QTableView
并向{{1}}提供数据的类中数据的访问的一般模式是什么?
答案 0 :(得分:1)
我不认为Qt的项目视图类(如QAbstractTableModel)和多个线程会很好地结合在一起。问题是QAbstractTableModel类应该在每次数据更改时通知所有关联的视图类,并且视图类也希望能够随时从数据模型中读取数据。如果更新和数据归不同的线程所有,那么实现(无论如何有效)将很难实现。我怀疑你提出的任何多线程解决方案都需要被大量序列化,以至于两个线程中只有一个最终会一次运行,此时你已经有效地回到单线程程序,只需要一个非常复杂的设计:)
我的建议是将你的10字符串数据库移动到main / Qt线程中,如果可能的话。您的网络操作也可以移动到主线程中(使用QSocketNotifier对象并确保I / O都是非阻塞的,这样它就不会阻止Qt事件循环并损坏GUI性能);或者你可以将网络保持在一个单独的网络线程中,只需让网络线程向main / Qt线程发送update-messages,告诉main / Qt线程如何更新数据库/表模型。关键是要通过main / Qt线程完成对数据模型数据库的所有读写操作。