Qt进度条不会逐渐增加,它会跳跃

时间:2011-12-09 16:49:54

标签: qt

我遇到了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;
}

1 个答案:

答案 0 :(得分:2)

您正在阻止事件循环

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

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

解决方案1:定期返回控制

这是上面user763305的processEvents建议。从技术上讲,这是一个临时解决方案,因为它只是解决问题。

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

这是一个更清洁的解决方案 - 通过将您的工作分成工作线程,您可以让GUI保持对传入事件的响应。 Qt提供了多种同时执行代码的方法。有关详细信息,请参阅以下链接。

来源: