gpt4 book ai didi

c++ - 无法使用在线程运行方法中运行的 CryptoPP FileSink 终止 Qt 线程

转载 作者:行者123 更新时间:2023-11-30 05:44:05 29 4
gpt4 key购买 nike

我有一个使用 C++ 和 QT5.4 编写的 UI 应用程序,我使用 CryptoPP 5.6.2 来加密文件。我遇到了以下问题:

  1. 当点击加密按钮时,一个基于this tutorial 的新线程被启动。 .

    // new thread
    CryptoWorkerThread = new QThread;
    this->worker = new CryptoWorker(fileName.c_str(), newFileName.c_str(), key, keyLength, iv);
    this->worker->moveToThread(CryptoWorkerThread);
    connect(worker, SIGNAL(error(QString)), this, SLOT(errorString(QString)));
    connect(CryptoWorkerThread, SIGNAL(started()), worker, SLOT(process()));
    connect(worker, SIGNAL(finished()), CryptoWorkerThread, SLOT(quit()));
    connect(worker, SIGNAL(finished()), this, SLOT(on_CryptoWorker_finished()));
    connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
    connect(CryptoWorkerThread, SIGNAL(finished()), CryptoWorkerThread, SLOT(deleteLater()));
    CryptoWorkerThread->start();
  2. 我将指向线程和工作线程的指针存储在主窗口类中(加密按钮的父级,因此也是槽)

    worker 类(Class):

    class CryptoWorker : public QObject {
    Q_OBJECT
    public:
    CryptoWorker(const char* sourceFileName, const char* destFileName, const byte * key, int keyLength, const byte * iv);
    ~CryptoWorker();

    const char* sourceFileName;
    const char* destFileName;

    public slots:
    void process();

    signals:
    void finished();
    void error(QString err);

    private:
    // add your variables here
    const byte* key;
    const byte* iv;
    int keyLength;
    };

    CryptoWorker::CryptoWorker(const char* sourceFileName, const char* destFileName, const byte * key, int keyLength, const byte * iv){
    this->sourceFileName = sourceFileName;
    this->destFileName = destFileName;
    this->key = key;
    this->keyLength = keyLength;
    this->iv = iv;
    }

    CryptoWorker::~CryptoWorker(){

    }

    void CryptoWorker::process(){

    CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption encryptor(key, keyLength, iv);


    CryptoPP::FileSource(sourceFileName, true,
    new CryptoPP::StreamTransformationFilter(
    encryptor,
    new CryptoPP::FileSink(destFileName),
    CryptoPP::BlockPaddingSchemeDef::PKCS_PADDING
    ),
    true // StreamTransformationFilter
    ); // FileSource

    emit finished();

    return;
    }

现在,当线程运行时,我使用这个函数将文件 A 动态加密到文件 B:

CryptoPP::FileSource(sourceFileName, true,
new CryptoPP::StreamTransformationFilter(
encryptor,
new CryptoPP::FileSink(destFileName),
CryptoPP::BlockPaddingSchemeDef::PKCS_PADDING
),
true // StreamTransformationFilter
); // FileSource

但是,线程会卡住,直到文件完成编码和写入,这可能需要几分钟。我无法终止线程,因为没有地方可以放置 isAlive() 检查。

我正在尝试找到一个解决方案,让我可以使用 FileSource、FileSink(与 fstream 或 file 或 qfile 相比,速度非常惊人),还可以让我在某个时候取消操作。

我通过添加另一个线程来检查正在创建的新加密文件 B 的大小来解决进度监控,但是控制在给定时刻正在写入的字节会很酷(这样我就可以检查 isAlive() 并增加数据计数器)。

此时我卡住了,找不到解决方案。请帮忙。

最佳答案

您可以尝试将 false 传递给 FileSource 构造函数的第二个参数 (pumpAll),并使用 Pump 方法 - 这应该允许检查 isAlive 并增加计数器。

关于c++ - 无法使用在线程运行方法中运行的 CryptoPP FileSink 终止 Qt 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29949471/

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