Qt进度条不是递增的,而是跳跃的

2024-05-02

我遇到 Qt GUI 进度条问题。问题是,对于较大的文件,350MB 及以上...进度条在开始时按预期工作,然后它似乎有一段时间没有移动,然后在工作完成时突然跳到 100%。我不确定为什么会发生这种情况,我想知道是否有一些 Qt 之谜导致了这种情况,或者我是否做错了什么。

#include "aClass.h"
#include <QString>
#include <QTextStream>
#include <QByteArray>
#include <QFile>

const char aClass::BLOCK_MODE_CBC = 1;

aClass::aClass()
{
}

qint64 aClass::doWorkA (const QString fileNameSrc, const QString fileNameDst, byte * a, byte * b, aBitSizeInBytes sizeaBytes, RWBufferSizeInBytes rwBufferSize)
{
    QFile infile(fileNameSrc);
    QFile outfile(fileNameDst);

    if(!infile.open(QIODevice::ReadOnly))
        return -1;
    if(!outfile.open(QIODevice::WriteOnly))
        return -1;

    qint64 sizeOfOriginalFileInBytes = infile.size();

    //Set range for progress bar
    int progressMax = sizeOfOriginalFileInBytes / rwBufferSize;
    if(progressMax == 0)
        progressMax = 1;
    emit setRange(0, progressMax);

    byte* readDataBuffer = new byte[rwBufferSize];
    byte* writeDataBuffer = new byte[rwBufferSize];
    qint64 readSize = 0;
    qint64 writeSize = 0;

    int progressCounter = 0;
    while (!infile.atEnd()) {
        readSize = infile.read((char*)readDataBuffer, rwBufferSize);
        writeSize = readSize;

        something.changeData(writeDataBuffer, readDataBuffer, writeSize);

        outfile.write((char*)writeDataBuffer, writeSize); 

        //Update progress bar value
        emit setValue(++progressCounter);
    }
    delete[] readDataBuffer;
    delete[] writeDataBuffer;
    infile.close();
    outfile.close();

    return 0;
}

您正在阻止事件循环

这是基于事件编程的一个经典问题。您需要确保永远不会阻塞事件循环,以保持 GUI 的响应能力。如果您不将主线程的控制权返回给 Qt,那么它就无法更新您的显示。

Qt 的设计理念是主 GUI 线程永远不会长时间保持忙碌状态。您的工作是确保长时间运行的任务不会阻塞事件队列。

解决方案 1:定期归还控制权

这是上面 user763305 的 processEvents 建议。从技术上讲,这是一个权宜之计,因为它只是回避了问题。

解决方案 2:在单独的线程中执行工作

这是更干净的解决方案 - 通过将您的工作拆分到工作线程中,您可以让 GUI 保持对传入事件的响应。 Qt 提供了多种并发执行代码的方法。请参阅下面的链接了解更多信息。

Sources:

  • http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/ http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/
  • http://doc.qt.nokia.com/latest/qrunnable.html http://doc.qt.nokia.com/latest/qrunnable.html
  • http://doc.qt.nokia.com/latest/qthreadpool.html http://doc.qt.nokia.com/latest/qthreadpool.html
  • http://doc.qt.nokia.com/latest/qthread.html http://doc.qt.nokia.com/latest/qthread.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt进度条不是递增的,而是跳跃的 的相关文章

随机推荐

  • 为什么要输入两次密码?

    在大多数网站的注册用户部分 他们要求您输入密码两次 这是为什么 为什么不只输入一次密码 为什么一定要 确认 呢 You know Username Password Confirm password Submit 这件事在我心里已经有一段时
  • 让垂直网格线出现在 matplotlib 的线图中

    我想在绘图上同时获得水平和垂直网格线 但默认情况下仅显示水平网格线 我正在使用一个pandas DataFrame从 python 中的 sql 查询生成 x 轴上带有日期的线图 我不知道为什么它们没有出现在日期上 我试图寻找这个问题的答案
  • SyntaxError:多个异常类型必须用括号括起来

    我是初学者 在使用 python 安装 pycaw 进行音频控制后遇到问题 在放置 pycaw 的基本初始化代码时 出现以下错误 Traceback most recent call last File c Users volumeCont
  • 免费 DTD 到 XSD 转换实用程序? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 DTD 需要将其转换为 XSD XML 架构 文件 有免费的实用程序或简单的方法来完成此任务
  • 使用会员提供程序的用户和角色列表

    我正在尝试使用内置的会员资格提供程序生成一个视图来显示用户列表及其角色 我的模型和控制器正在获取用户和角色 但我无法在视图中显示它们 Model public class AdminViewModel public MembershipUs
  • ElasticSearch JavaAPI (SearchScroll)- search_context_missing_exception","re​​ason":"找不到 id 的搜索上下文

    我正在获取超过100k使用一个索引中的文档searchScroll并在所有字段中再添加一个字段100K文件 然后再次将这些文档插入到另一个新索引中 我正在使用SearchScrollapi 也在设置大小searchSourceBuilder
  • 在 R 中绘制非常大的数据集

    如何在 R 中绘制非常大的数据集 我想使用箱线图 小提琴图或类似的图 内存中无法容纳所有数据 我可以逐步读入并计算制作这些图所需的摘要吗 如果是这样怎么办 作为对我的评论的补充德米特里回答 https stackoverflow com q
  • 为什么我的 Linux 应用程序引入了错误的 .so 库?

    我正在构建一个使用 NetCDF C 库的应用程序 并且 NetCDF 正在引入 HDF 4 库 然而 它正在拉动wrongHDF 4 库 我的应用程序的链接方式如下 apps1 intel bin icpc gxx name apps1
  • 将resourceBundle与外部文件java一起使用

    我一直在阅读有关此问题的其他问题和答案 但我不明白资源边界是如何完全工作的 我认为这与 Joomla 使用多语言选项的方式类似 基本上 您有要阅读的不同语言的不同消息的文件 所以我在 src Lang 文件夹中创建了 System prop
  • 如何在Azure上运行nodejs、express js项目的启动命令?

    我在用Azure 开发运营对于我的应用程序 我不确定如何为该项目设置启动命令 如果我将它添加到创建的管道中的任务中 它会给出一个错误 也许是因为该过程永远不会结束 实际上 我可以运行 npm install 并创建工件 但我需要应用程序启动
  • 弹出到主屏幕

    在我的应用程序中 我一个接一个地喜欢一些屏幕 并且我需要随时弹出到主屏幕 有什么方法可以找出活动屏幕是否是第一个 或者 可能有什么功能可以弹出到根屏幕而不循环弹出到以前的屏幕 EDIT换句话说 我需要我的应用程序在单击黑莓 后退 按钮时转到
  • 结束一天(日期时间)的最优雅的方式是什么?

    我目前正在编写一些报告代码 允许用户选择指定日期范围 它的工作方式 简化 是 用户 可选 指定年份 用户 可选 指定月份 用户 可选 指定一天 这是一个代码片段 以及描述我想要的内容的注释like to do from datetime i
  • ns_initparse 的链接器错误

    这是代码 include
  • 从 SQL 获取 xml 属性

    对于此 xml 在 SQL 2005 XML 列中
  • 为什么删除 DataFrame 的列或部分会增加内存使用量,以及如何确保对未使用的 DataFrame 切片进行垃圾回收

    处理大型 DataFrame 时 您需要小心内存使用情况 例如 您可能想要分块下载大数据 处理这些块 然后从内存中删除所有不必要的部分 我找不到任何有关处理垃圾收集的最佳程序的资源pandas 但我尝试了以下方法并得到了令人惊讶的结果 im
  • 如何在 Octave 中有效地从 csv 读取大矩阵

    有很多关于 Octave 性能缓慢的报告dlmread 我希望这个问题在 3 2 4 中得到修复 但是当我尝试加载大小为 ca 的 csv 文件时 8 4百万 总共32百万 也花了非常非常长的时间 我在网上搜索但找不到解决此问题的方法 有人
  • 插入失败“OperationalError:没有这样的列”

    我尝试使用我尝试修复的姓名和电话创建一个数据库 但它会随时向我重播 File exm0 py line 14 in
  • 调用控制器 Post 方法时遇到问题

    这是我的方法 AcceptVerbs HttpVerbs Post public void SaveImage FormCollection formValues byte contents Convert FromBase64String
  • 构建可重复使用的 Sikuli 屏幕截图库的策略是什么?

    我想使用 Sikuli 来自动化在 Mac OS X 和 Windows 上的浏览 器中运行的 GUI 应用程序和 Web 应用程序 目前 我的目的不是测试 而是为团队提供 GUI 自动化执行繁琐 重复性的任务 不幸的是 该团队目前没有较低
  • Qt进度条不是递增的,而是跳跃的

    我遇到 Qt GUI 进度条问题 问题是 对于较大的文件 350MB 及以上 进度条在开始时按预期工作 然后它似乎有一段时间没有移动 然后在工作完成时突然跳到 100 我不确定为什么会发生这种情况 我想知道是否有一些 Qt 之谜导致了这种情