VS+QT刷新排序读取位置时发生访问冲突

实现要求:界面定时按照排序刷新界面。结果不定时会报错:读取访问冲突。有时候半个小时,有时候2天。代码如下:

img

img

修改了实现后,但还是报错。如图:

img

图1贴错了,应该把start的注释取消。

应该是timer事件触发时,上次的执行还没执行完。 你在timer对应的slot函数里加上互斥锁试下https://blog.csdn.net/wj584652425/article/details/123585126

m_proxy2对象类以及sort函数是怎么定义的

proxy model没看出什么问题,问题可能出在你的source model。你的source model会动态添加删除数据吗?

排查一下界面数据来源是否有异常数据,可能没有对异常数据判断,作为正常数据处理导致崩溃

可尝试在崩溃时查看堆栈信息,查找出问题的原始原因更好定位。

void QSortFilterProxyModel::sort(int column, Qt::SortOrder order)
{
    Q_D(QSortFilterProxyModel);
    if (d->dynamic_sortfilter && d->proxy_sort_column == column && d->sort_order == order)
        return;
    d->sort_order = order;
    d->proxy_sort_column = column;
    d->update_source_sort_column();
    d->sort();
}

void QSortFilterProxyModelPrivate::sort()
{
    Q_Q(QSortFilterProxyModel);
    emit q->layoutAboutToBeChanged(QList<QPersistentModelIndex>(), QAbstractItemModel::VerticalSortHint);
    QModelIndexPairList source_indexes = store_persistent_indexes();
    const auto end = source_index_mapping.constEnd();
    for (auto it = source_index_mapping.constBegin(); it != end; ++it) {  // 如数据源变化,则迭代器将无效化,导致异常。
        const QModelIndex &source_parent = it.key();
        Mapping *m = it.value();
        sort_source_rows(m->source_rows, source_parent);
        build_source_to_proxy_mapping(m->source_rows, m->proxy_rows);
    }
    update_persistent_indexes(source_indexes);
    emit q->layoutChanged(QList<QPersistentModelIndex>(), QAbstractItemModel::VerticalSortHint);
}

排序过程中容器内容发生了变化,导致迭代器无效,出现异常错误。

  1. 建议检查数据源是否有其他地方做修改操作。

贴一下完整代码,或者私发我,可以帮你分析一下

1.一个原因可能是:在VS下编写QT小程序测试各种输出时,报了一个很常见又很讨厌的错误“...读取位置...时发生访问冲突”,调试跟进也没有指针乱指、内存未分配、只读却写等问题,在已经放弃了这种输出方法换下一种时,发现UI的参数每初始化一下就会输出一次,但是原本应该是全部初始化后才输出一次的。于是回过头去看UI部分,原来是connect()的位置问题...

connect()的位置很可能会导致这种访问冲突问题,当connect放在最前边时,就会导致内存尚未分配就connect的情况,尤其是这个connect的信号是参数值改变,那么初始化时参数的值由无到有也是一种改变,因此,当遇到访问冲突,调试无果时,不妨试试把connect扔到构造函数的最下边,问题也许就迎刃而解了...

2.还有一个由此引出的问题,你是否对指针进行了初始化,分配了空间