gpt4 book ai didi

file - 从不同的线程更新 QProgressbar

转载 作者:行者123 更新时间:2023-12-01 05:17:07 26 4
gpt4 key购买 nike

我开发了自己的混合流密码,并且我使用 Qt 作为 GUI。最初我是在一个线程上写的,但它是一个流密码,在对大文件进行操作时使 GUI 功能失调。所以我将加密/解密转移到一个单独的 Qthread。另外为了显示进度,我在 GUI 上包含了一个标准的 QProgressbar。但是当我运行文件 I/O 时,加密/解密工作完美,但进度条没有正确更新。整个操作完成后,进度条突然从0%变成100%,说明操作过程中没有机会更新。对于代码,我将完成的百分比从 FileCrypto 发送到主 GUI 线程到 QProgressbar 的 setValue(int) 槽上。由于它不起作用,我还尝试将一个 int 指针发送到 FileCrypto 线程,同时用百分比更新指针,并在 GUI 线程上使用 QTimer 在本地检查 int 值的值并更新进度条,但仍然我得到了完全相同的结果。

这是我的代码:

FileCrypto 类:

#include <QThread>
#include <QFile>
#include <PolyVernam.h> //my algo header

class FileCrypto : public QThread
{
Q_OBJECT

public:
FileCrypto(QString, QString, int);
bool stopIt;

protected:
void run();

signals:
void completed(int);
void msg(QString);
void pathMsg1(QString);
void pathMsg2(QString);
void keyMsg(QString);

private:
QFile src, dest;
QString tag;
int mode;
qint64 length;
PolyVernam pv;
};

代码:

#include <FileCrypto.h>

FileCrypto::FileCrypto(QString input, QString keyFile, int mode)
{
stopIt = false;
this->mode = mode;
src.setFileName(input);

if(mode == 1)
{
emit msg("Current Encryption/Decryption status: Encrypting file... :D:D");
tag = "-encrypted";
pv.setMode("encrypt", "");
}
else
{
emit msg("Current Encryption/Decryption status: Decrypting file... :D:D");
tag = "-decrypted";
pv.setMode("decrypt", keyFile);
}

dest.setFileName(QFileInfo(src).absolutePath() + "/" + QFileInfo(src).baseName()
+ tag + "." + QFileInfo(src).completeSuffix());

length = src.bytesAvailable();
}

void FileCrypto::run()
{
qint64 done = 0;
quint8 r, outChar;
char ch;

QDataStream in(&src);
in.setVersion(QDataStream::Qt_4_7);
src.open(QIODevice::ReadOnly);

QDataStream out(&dest);
out.setVersion(QDataStream::Qt_4_7);
dest.open(QIODevice::WriteOnly);

while(!in.atEnd() && !stopIt)
{
done++;

in >> r;
ch = char(r);

if(mode == 1)
outChar = pv.encrypt(QString(ch)).at(0).toAscii();
else
outChar = pv.decrypt(QString(ch)).at(0).toAscii();

out << outChar;

emit completed(int((done / length) * 100));
}

src.close();
dest.close();

if(stopIt)
this->exit(0);

if(mode == 1)
{
emit pathMsg1(QFileInfo(src).absoluteFilePath());
emit pathMsg2(QFileInfo(dest).absoluteFilePath());
}
else
{
emit pathMsg1(QFileInfo(dest).absoluteFilePath());
emit pathMsg2(QFileInfo(src).absoluteFilePath());
}

emit keyMsg(pv.keyFilePath);
emit msg("Current Encryption/Decryption status: Idle... :'(");
}

这就是我创建线程并将其连接到主 GUI 线程的方式:

FileCrypto *fc = new FileCrypto(ui->lineEdit_4->text(), "", 1);

connect(fc, SIGNAL(completed(int)), ui->progressBar, SLOT(setValue(int)));
connect(fc, SIGNAL(msg(QString)), ui->statusBar, SLOT(showMessage(QString)));
connect(fc, SIGNAL(pathMsg1(QString)), ui->lineEdit_4, SLOT(setText(QString)));
connect(fc, SIGNAL(pathMsg2(QString)), ui->lineEdit_5, SLOT(setText(QString)));
connect(fc, SIGNAL(keyMsg(QString)), ui->lineEdit_2, SLOT(setText(QString)));
connect(fc, SIGNAL(keyMsg(QString)), this, SLOT(done()));

如果我不更新进度条,即不发出百分比,这个过程就会快得多。我也尝试打印百分比。它像 hell 一样减慢速度,但值(value)很好。您还可以建议一种将其更改为缓冲 IO 的方法....

在此非常感谢任何形式的帮助......

最佳答案

问题不在于您从不同的线程调用。它位于:

emit completed(int((done / length) * 100));

donelength是 int 类型,done <= length , done/length == 0 .所以将其更改为:

emit completed(100 * done / length);

(它会导致算术溢出)。

关于file - 从不同的线程更新 QProgressbar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11295749/

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