gpt4 book ai didi

Qt Progress Bar 不是递增的,它是跳跃的

转载 作者:行者123 更新时间:2023-12-03 18:30:16 30 4
gpt4 key购买 nike

我在使用 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 提供了多种方式来并发执行代码。有关详细信息,请参阅下面的链接。

来源:

关于Qt Progress Bar 不是递增的,它是跳跃的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8448852/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com