查看完整版本: [-- 在“模型-视图”中,如果我在子线程中处理数据模型,会引起数据访问冲突吗? --]

QTCN开发网 -> Qt基础编程 -> 在“模型-视图”中,如果我在子线程中处理数据模型,会引起数据访问冲突吗? [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

shineryu 2022-06-15 18:39

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

在“模型-视图”中,如果我在子线程中处理数据模型,会引起数据访问冲突吗?
我继承了一个QStandardItemModel类,在构造函数里加入如下代码:
m_thread = new QThread;
this->moveToThread(m_thread);
m_thread->start();
后面用信号-槽来做,外部接口通过发送信号来让这个类处理数据。
按理说,这个类里的操作只要是通过信号触发的,都是在一个线程里串行执行的。
结果在运行过程中会随机报错退出。
如果不在子线程中处理数据模型,就是说将上面几行注释掉,就不会报错。
很奇怪,啥原因呢?难道是绑定的视图类在主界面线程中引起数据访问冲突了?
版本:Qt 5.12.8

介农酥 2022-06-28 16:37
给的信息是不是太少了吧,比如什么报错,打断点看了没有,什么地方报错的啊,一般突然报错,至少也能看到堆栈的地方吧。

shineryu 2022-07-22 20:40
介农酥:给的信息是不是太少了吧,比如什么报错,打断点看了没有,什么地方报错的啊,一般突然报错,至少也能看到堆栈的地方吧。 (2022-06-28 16:37) 

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

clickto 2022-07-23 22:05
遇到过同样的问题,多方探索解决方案无果,会随机出现问题,最后还是回归到界面线程处理。
猜测可能是模型绑定了数据库,但是数据库在线程中使用需要在线程中定义连接,只是猜测。


查看完整版本: [-- 在“模型-视图”中,如果我在子线程中处理数据模型,会引起数据访问冲突吗? --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled