QStandardItemModel的data线程安全

本文探讨了在使用QStandardItemModel进行大量数据插入时,由于QListView显示图片缩略图的需求,导致的线程安全问题。当appendRow函数在非UI线程运行时,可能导致data在读写时的并发访问冲突。为解决此问题,提出了两种解决方案:一是通过继承QAbstractItemModel并引入QMutex锁确保数据读写的线程安全;二是临时禁止sizeHint在插入数据时读取model的data。建议在时间紧迫的项目中采用第二种方法。
摘要由CSDN通过智能技术生成

在直接使用QStandardItemModel存取数据时,必须考虑线程安全问题

  1. 以下是使用场景:
      QListView用于显示图片缩略图,而整个view有一万以上的缩略图,也就是说item项在一万以上
    在大量的数据插入过程中,void QStandardItemModel::appendRow(QStandardItem *item) 这个函数是比较慢的,即使插入空的QStandarItem而不填充任何数据,一万项数据的插入操作也是级别的,所以需要用到线程来进行插入操作

  2. 以下是问题:
      在void QStandardItemModel::appendRow(QStandardItem *item) 运行于其他非UI主线程时,完成操作后UI会在更新数据后主动刷新,这时,QSize QStyledItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const函数会读取Qt::SizeHintRole的数据,我们就会遇到data的写跟读在不同线程同时被访问的问题

  3. 以下是我的解决方法:

    • 继承QAbstractItemModel实现数据读写,在读写过程中加入QMutex锁
    • 在插入数据时,临时禁止sizeHint
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值