• 1140阅读
  • 3回复

[提问]在“模型-视图”中,如果我在子线程中处理数据模型,会引起数据访问冲突吗? [复制链接]

上一主题 下一主题
离线shineryu
 

只看楼主 倒序阅读 楼主  发表于: 2022-06-15
在“模型-视图”中,如果我在子线程中处理数据模型,会引起数据访问冲突吗?
继承了一个QStandardItemModel类,在构造函数里加入如下代码:
m_thread = new QThread;
this->moveToThread(m_thread);
m_thread->start();
后面用信号-槽来做,外部接口通过发送信号来让这个类处理数据。
按理说,这个类里的操作只要是通过信号触发的,都是在一个线程里串行执行的。
结果在运行过程中会随机报错退出。
如果不在子线程中处理数据模型,就是说将上面几行注释掉,就不会报错。
很奇怪,啥原因呢?难道是绑定的视图类在主界面线程中引起数据访问冲突了?
版本:Qt 5.12.8
1条评分金钱+10
20091001753 金钱 +10 数据的计算与处理可以给子线程,然后把需要展示的结果数值给主线程显示就好了。 2022-06-15
离线介农酥

只看该作者 1楼 发表于: 2022-06-28
给的信息是不是太少了吧,比如什么报错,打断点看了没有,什么地方报错的啊,一般突然报错,至少也能看到堆栈的地方吧。
离线shineryu

只看该作者 2楼 发表于: 2022-07-22
回 介农酥 的帖子
介农酥:给的信息是不是太少了吧,比如什么报错,打断点看了没有,什么地方报错的啊,一般突然报错,至少也能看到堆栈的地方吧。 (2022-06-28 16:37) 

这个project已经相当大了,而且这个报错是随机的,可能运行几个小时后报错,也可能运行几天后报错,调试不起。报错即退出,也没有什么错误码,就是windows的那种消息框,说xxx.exe运行错误,已经停止运行,巴拉巴拉。
但是确实是如果不放在后台线程更新model就不会报错。
我看到一篇文章:
https://www.codeleading.com/article/67861074935/
这里提到了类似的问题,他说是QStyledItemDelegate::sizeHint()读写冲突,但是他那文章中是在后台线程中强制调用了主界面线程的函数updateViewPortSize(),所以我觉得和我的情况也是不一样的。
然而,我做了个极端情况下的调试,结果确实发现在调用sizeHint()函数时,会有指针越界报错。但是这都是Qt后台自动处理的,并不是我能控制的。我现在怀疑,难道Model不能在后台线程里更新?如果这样的话,那么经常性的大量数据更新就只能在界面线程中执行了,这岂不太笨了?
在线clickto

只看该作者 3楼 发表于: 2022-07-23
遇到过同样的问题,多方探索解决方案无果,会随机出现问题,最后还是回归到界面线程处理。
猜测可能是模型绑定了数据库,但是数据库在线程中使用需要在线程中定义连接,只是猜测。
快速回复
限100 字节
 
上一个 下一个