1

如何同步访问从 Qt 模型/视图设置中的多个线程访问的数据?

我正在QTableViewModel班级一起使用。

Model扩展QAbstractTableModel并具有一个自定义类的实例,该类Net包含要QTableView通过data()调用显示的实际数据(由 访问Model::data()

我的班级监听网络数据并在单独的线程上运行,从该线程更新它的数据(10 个字符串的简单固定大小数组)。

我的类中的数据必须通过不断更新它的线程和 Qt GUI 通过调用data()on来访问Model

我假设我需要使用互斥锁来同步对我的字符串数组的访问,但QAbstractTableModel::data()它是一种const方法,所以我不能锁定boost::mutex它。

什么是同步访问类中的数据的一般模式,该类扩展QAbstractTableModel并提供数据QTableView

4

1 回答 1

1

我不认为 Qt 的项目视图类(如 QAbstractTableModel)和多个线程会很好地结合在一起。问题是 QAbstractTableModel 类希望在每次数据更改时通知所有关联的视图类,并且视图类也希望能够随时从数据模型中读取数据。如果更新和数据由不同的线程拥有,那么实现这一点将很难(无论如何是有效的)。我怀疑您提出的任何多线程解决方案都需要大量序列化,以至于两个线程中只有一个线程最终会同时运行,此时您实际上已经回到单线程程序,只需一个非常复杂的设计:)

如果可能的话,我的建议是将你的 10 字符串数据库移到主/Qt 线程中。您的网络操作也可以移到主线程中(使用 QSocketNotifier 对象并确保 I/O 都是非阻塞的,这样它就不会阻止 Qt 事件循环并损害 GUI 性能);或者您可以将网络保持在单独的网络线程中,并让网络线程向主/Qt 线程发送更新消息,告诉主/Qt 线程如何更新数据库/表模型。关键是让主/Qt 线程完成对数据模型数据库的所有读取和写入。

于 2011-12-20T06:44:08.323 回答