实现要求:界面定时按照排序刷新界面。结果不定时会报错:读取访问冲突。有时候半个小时,有时候2天。代码如下:
修改了实现后,但还是报错。如图:
图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.一个原因可能是:在VS下编写QT小程序测试各种输出时,报了一个很常见又很讨厌的错误“...读取位置...时发生访问冲突”,调试跟进也没有指针乱指、内存未分配、只读却写等问题,在已经放弃了这种输出方法换下一种时,发现UI的参数每初始化一下就会输出一次,但是原本应该是全部初始化后才输出一次的。于是回过头去看UI部分,原来是connect()的位置问题...
connect()的位置很可能会导致这种访问冲突问题,当connect放在最前边时,就会导致内存尚未分配就connect的情况,尤其是这个connect的信号是参数值改变,那么初始化时参数的值由无到有也是一种改变,因此,当遇到访问冲突,调试无果时,不妨试试把connect扔到构造函数的最下边,问题也许就迎刃而解了...
2.还有一个由此引出的问题,你是否对指针进行了初始化,分配了空间