QAbstractItemModel 线程安全

2024-01-17

我的实施QAbstractItemModel正在监听一些事件,并在单独的线程中处理更新。 更新的处理可能会导致模型中的布局和/或数据更改。 数据本身的存储方式是boost::mutex- 受到保护,每次通话QAbstractItemModel的接口函数(如果我理解正确的话,在 GUI 线程中执行)和更新处理函数(在单独的线程中)锁定互斥体。 是否可以发出信号layoutChanged/dataChanged,同时锁定 data()/rowCount()/任何可能试图同时获取的相同互斥体?

一段代码:

class MyItemModel : public QAbstractItemModel {
    Q_OBJECT
public:

    void processUpdate(const Update& update) {
        Mservice.post([this, update]() {
            boost::lock_guard<boost::mutex> lock (Mlock);
            bool willModifyLayout = checkWillModifyLayout(update)
            bool willModifyData = checkWillModifyData(update);
            if (willModifyLayout) {
                emit layoutAboutToBeChanged();
            }
                Mdata.processUpdate(update);
            if (willModifyLayout) {
                emit layoutChanged();
            }
            else if (willModifyData) {
                emit dataChanged();
            }            
        });
    }

    virtual QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE {
        boost::lock_guard<boost::mutex> lock (Mlock);
        if (index.isValid()) return Mdata.data(index, role);
    }

private:
    boost::mutex Mmutex;
    boost::asio::service Mservice;
    boost::asio::thread MserviceThread;
    DataStorage Mdata;

}

找到了我自己的问题的答案: 如果模型属于不同的QThread,那么该模型的信号将使用Qt::QueuedConnection连接到视图,这样就可以了。 但是如果(默认情况下)模型属于 GUI QThread(又名 QCoreApplication::instance()->thread()),模型的槽将立即执行,导致调用 data()、columnCount() 等,因此,这不行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QAbstractItemModel 线程安全 的相关文章

  • 如何创建语法突出显示文本框[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 C Net 创建语法突出显示文本框 Take 闪烁网 http scintillanet codeplex com 并采取其
  • 为什么使用数组索引循环数组比指针访问慢?

    我正在读Kochan的书 Programming in C 在第 14 页的 指针和数组 部分中 264 他说 一般来说 索引数组的过程比执行索引过程花费更多的时间 访问指针内容的过程 其实这也是主要原因之一 为什么使用指针来访问数组的元素
  • C语言实现延时函数

    我想使用空循环实现延迟函数 但是完成一次循环所需的时间取决于编译器和机器 我希望我的程序自行确定时间并将程序延迟指定的时间 谁能给我任何想法如何做到这一点 注意 有一个名为delay 的函数可以将系统暂停指定的毫秒 是否可以在不使用此功能的
  • 有没有办法找到dll公开的所有函数

    我一直在寻找一种方法来获取映射到 dll 中函数名称的所有字符串 我的意思是您可以调用 GetProcAddress 的所有字符串 如果你对 dll 进行十六进制转储 符号 字符串 就在那里 但我认为必须有一个系统调用来获取这些名称 如果您
  • 使用样式表时的 QTabWidget tabPosition

    我目前正在使用样式表来设计应用程序的主题 这是我用于 QTabWidget 的样式表 QTabBar et QTabWidget QTabBar tab background qlineargradient spread pad x1 0
  • 为什么我收到编译错误“使用已删除的函数 'std::unique_ptr ...”

    我收到一条巨大的编译错误消息 c mingw include c 6 1 0 bits predefined ops h 123 18 error use of deleted function std unique ptr lt Tp D
  • 可以通过模板间接访问基类中的私有类型

    我试图在编译时根据类型是否在给定范围内公开可用来选择要使用的类型 最好直接看代码 include
  • 使用 FromBase64Transform 解码 base64 文件流

    The example https msdn microsoft com en us library system security cryptography frombase64transform 28v vs 110 29 aspx从M
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • 为什么最小的 int -2147483648 的类型为“long”? [复制]

    这个问题在这里已经有答案了 对于一个学校项目 我必须编写 C 函数 printf 的代码 一切进展顺利 但有一个问题我找不到好的答案 所以我来了 printf PRINTF d t d n 2147483648 告诉我 gcc Werror
  • 当分配返回 0 时,具有空异常规范的运算符 new 调用构造函数

    我有以下声明 void operator new size t s PersistentMemory m throw return m gt allocatePersistentMemory s 我正在测试启动时的内存耗尽 这会导致m gt
  • 当一对迭代器初始化时,向量是否知道先保留?

    考虑以下代码 struct MyData MyData const BYTE pData size t uSize bucket pData pData uSize std vector
  • 我的代码哪里有泄漏?

    下面是我的代码 它打开一个 XML 文件 old xml 过滤无效字符并写入另一个 XML 文件 abc xml 最后 我将再次加载 XML abc xml 当执行以下行时 出现异常 表示 xml 文件被另一个进程使用 xDoc Load
  • 链接到ntdll.lib并调用ntdll.dll内部的函数

    我最近正在对私有 API 进行一些研究 我尝试调用诸如NtOpenFile在 ntdll dll 中LoadLibrary and GetProcAddress在运行时 幸运的是 它成功了 今天早上我在电脑上进行了文件搜索 发现ntdll
  • QGraphicsView 在完整布局中未最大化

    I have following GUI having four QGraphicView objects 正如您在每个视图下看到的那样 它有四个工具按钮 为了最大化视图 我连接了工具按钮的信号来隐藏其他三个视图的插槽 并将大小策略设置为扩
  • 为什么我无法通过 lambda 捕获“this”指针?

    考虑以下代码 class A public void foo auto functor this A a this auto functor a The compiler won t accept this instead of a a g
  • 如何使用 .NET 捕获我的桌面视频?

    我想知道是否有任何方法可以使用 NET 捕获我的桌面的视频 截屏视频 我并不是在寻找截屏软件 而只是在寻找一种可以让我自己生成桌面视频的技术 我想过拍摄多个屏幕截图 但我不确定如何以编程方式生成带有图像序列的视频 有人有主意吗 Thanks
  • 小数精度

    我使用小数类型进行高精度计算 货币 但我今天遇到了这个简单的划分 1 1 37 这应该再次得到 37 http www wolframalpha com input i 1 2F 281 2F37 29 http www wolframal
  • SMTP 客户端在 C# 应用程序中显示错误“未采取请求的操作”

    我正在尝试使用 hotmail 帐户设置电子邮件发送应用程序 代码如下所示 MailMessage mail new MailMessage from to mail Subject Proba email mail Attachments
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个

随机推荐

  • 使用边框半径将子元素剪辑到父元素

    如何强制将子元素剪辑到具有圆角的父元素 div class item div class top h1 Tile h1 h2 Click me h2 div div class behind h3 Details h3 div div 当为
  • java.lang.NoSuchMethodError org.springframework.core.annotation.AnnotationUtils.getAnnotation

    当我运行 junit 测试时 我可以获得正确的结果 并且数据可以存储到数据库中 当我将项目部署到 tomcat 中时 出现此异常 我的spring版本是3 1 1 tomcat版本是6 0 2012 02 29 16 40 54 968 E
  • 如何在 TensorFlow 中生成随机向量并维护它以供进一步使用?

    我正在尝试生成一个随机变量并使用它两次 但是 当我第二次使用它时 生成器会创建第二个随机变量 该变量与第一个随机变量不同 这是演示代码 import numpy as np import tensorflow as tf A random
  • JGoodies 绑定教程代码发生了什么?

    我想学习如何使用 JGoodies 绑定 因为 beans 绑定似乎已死在水中 它的 fork 也是如此 JGoosides 绑定文档引用了教程源代码 但此代码在最新 2 5 发行版中不可用 查看以前的发行版本后 似乎教程代码已在 2 0
  • R Shiny:本地运行应用程序与部署应用程序时导出的 PNG 分辨率不同

    我想在部署的 Shiny 应用程序中创建具有手动指定分辨率的 PNG 图像 此 PNG 图像应保存在我的 Dropbox 中 由于某种原因 我的 Shiny 应用程序的部署版本没有采用res内的论证png功能考虑在内 考虑以下示例 Load
  • 如何获得high_resolution_clock的精度?

    C 11 定义high resolution clock它有成员类型period and rep 但我不知道如何才能得到精确那个时钟的 或者 如果我可能无法达到精确度 我是否可以至少以纳秒为单位得到一个计数最小可表示持续时间刻度之间 可能使
  • 用作异步任务时出现后台服务错误

    我在 Xamarin Android 中有一个后台服务 但问题是我无法将其用作Async方法 它给出一个错误 返回类型必须是 StartCommandResult 以匹配重写成员 Service OnStartCommand Intent
  • XSLT 具有重叠元素?

    所以这篇文章的标题可能有点误导 但这是我能想到的最好的标题 我正在开发一个使用 TEI 进行文本编码的项目 我当前工作的要求之一是编写 XSL 转换以将 XML 编码的文本呈现为 HTML 大多数情况下 没有问题 不过 我对这个问题有点困惑
  • 选择器不区分大小写?

    我正在尝试使用 jQuery 进行 XML 处理 我使用 jQuery 遇到的问题之一是它在处理标签和属性时不区分大小写 例如 考虑以下代码 div div
  • 将术语转换为原子并在 YAP prolog 中保留变量名称

    有没有办法配置 YAP 和 或 SWI prolog 以便它们在任何调用中保留变量名称term to atom 2 例如 当我执行此操作时 term to atom member X 1 2 A 我得到这个答案 A member 13140
  • 如何确定 HTML5 拖放文件上传 API 是否存在(如 FF3.6 中的 API)

    我正在编写一个应用程序 该应用程序应该支持文件的 HTML5 拖 放 API 非常类似于所描述的here https developer mozilla org en Using files from web applications Se
  • dplyr 过滤器不适用于润滑时间格式?

    当试图回答时这个问题 https stackoverflow com questions 46360218 delete all times less than a specified value 我遇到了使用问题filter from d
  • 在后台执行命令

    我正在实现一个迷你 shell 它将模拟真正的 bash shell 我在后台执行命令 例如ls 我的第一个方法如下 不起作用 char execArgs ls NULL execvp ls execArgs 然后我尝试了另一种方法 修改父
  • 如何将多个参数传递到 JavaScript 回调函数中?

    JavaScript 代码 function doSomething v1 v2 blah function SomeClass callbackFunction callbackFuncParameters Array this call
  • Jython 2.5.1:从 Java 调用 __main__ - 如何传入命令行参数?

    我在 Java 中使用 Jython 所以我有一个类似于下面的Java设置 String scriptname com blah myscript py PythonInterpreter interpreter new PythonInt
  • 从元组列表中提取不同的值

    如何从以下元组列表中提取不同值的列表 tuple test 123 test 465 test 8910 test2 123 我想得到一个像这样的列表 different values test test2 现在我想通过这个 键 访问所有值
  • 在运行时填充多维向量

    显然这不起作用 所以代码是错误的 但我该如何修复它呢 据我所知 这整件事可能是错误的 哈哈 但我正在尝试创建一个在运行时创建自身的多维向量 我收到错误 vector subscript out of range include
  • jersey ws 2.0 @suspended AsyncResponse,它有什么作用?

    我正在分析一些 jersey 2 0 代码 我对以下方法如何工作有疑问 Stateless Path mycoolstuff public class MyEjbResource GET Asynchronous does this mea
  • 单例继承

    如何从单例类继承到需要相同功能的其他类 这样的事情有意义吗 乔恩 斯基特写过这个 http codeblog jonskeet uk 2006 01 19 singleton inheritance 一会儿回来 是可以实现的some尽管使用
  • QAbstractItemModel 线程安全

    我的实施QAbstractItemModel正在监听一些事件 并在单独的线程中处理更新 更新的处理可能会导致模型中的布局和 或数据更改 数据本身的存储方式是boost mutex 受到保护 每次通话QAbstractItemModel的接口