问:如何在模型/视图设置中同步对来自多个线程的数据的访问?

时间:2011-12-20 00:41:48

标签: c++ qt qtableview qabstracttablemodel

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

我正在使用QTableView Model类。

Model扩展了QAbstractTableModel并拥有自定义类Net的实例,该实例保存通过QTableView调用显示到data()的实际数据(由Model::data()

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

我的类中的数据必须由不断更新它的线程访问,并通过调用data()上的Model从Qt GUI访问。

我认为我需要使用互斥锁来同步对我的字符串数组的访问,但QAbstractTableModel::data()const方法,所以我无法锁定boost::mutex

用于同步对QAbstractTableModel扩展QTableView并向{{1}}提供数据的类中数据的访问的一般模式是什么?

1 个答案:

答案 0 :(得分:1)

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

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