made hasing task async
Signed-off-by: Trial97 <alexandru.tripon97@gmail.com>
This commit is contained in:
parent
766ddc80e3
commit
9cbdbddb08
@ -213,7 +213,7 @@ class ExtractZipTask : public Task {
|
|||||||
{}
|
{}
|
||||||
virtual ~ExtractZipTask() = default;
|
virtual ~ExtractZipTask() = default;
|
||||||
|
|
||||||
typedef std::optional<QString> ZipResult;
|
using ZipResult = std::optional<QString>;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void executeTask() override;
|
virtual void executeTask() override;
|
||||||
|
@ -1,16 +1,11 @@
|
|||||||
#include "HashUtils.h"
|
#include "HashUtils.h"
|
||||||
|
|
||||||
|
#include <QBuffer>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
#include <QtConcurrentRun>
|
||||||
#include "FileSystem.h"
|
|
||||||
#include "StringUtils.h"
|
|
||||||
|
|
||||||
#include <MurmurHash2.h>
|
#include <MurmurHash2.h>
|
||||||
#include <qbuffer.h>
|
|
||||||
#include <qcryptographichash.h>
|
|
||||||
#include <qdebug.h>
|
|
||||||
#include <qfiledevice.h>
|
|
||||||
|
|
||||||
namespace Hashing {
|
namespace Hashing {
|
||||||
|
|
||||||
@ -143,12 +138,28 @@ QString hash(QByteArray data, Algorithm type)
|
|||||||
|
|
||||||
void Hasher::executeTask()
|
void Hasher::executeTask()
|
||||||
{
|
{
|
||||||
m_result = hash(m_path, m_alg);
|
m_zip_future = QtConcurrent::run(QThreadPool::globalInstance(), [this]() { return hash(m_path, m_alg); });
|
||||||
if (m_result.isEmpty()) {
|
connect(&m_zip_watcher, &QFutureWatcher<QString>::finished, this, [this] {
|
||||||
|
if (m_zip_future.isCanceled()) {
|
||||||
|
emitAborted();
|
||||||
|
} else if (m_result = m_zip_future.result(); m_result.isEmpty()) {
|
||||||
emitFailed("Empty hash!");
|
emitFailed("Empty hash!");
|
||||||
} else {
|
} else {
|
||||||
emitSucceeded();
|
emitSucceeded();
|
||||||
emit resultsReady(m_result);
|
emit resultsReady(m_result);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
m_zip_watcher.setFuture(m_zip_future);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Hasher::abort()
|
||||||
|
{
|
||||||
|
if (m_zip_future.isRunning()) {
|
||||||
|
m_zip_future.cancel();
|
||||||
|
// NOTE: Here we don't do `emitAborted()` because it will be done when `m_build_zip_future` actually cancels, which may not
|
||||||
|
// occur immediately.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
} // namespace Hashing
|
} // namespace Hashing
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QCryptographicHash>
|
#include <QCryptographicHash>
|
||||||
|
#include <QFuture>
|
||||||
|
#include <QFutureWatcher>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
#include "modplatform/ModIndex.h"
|
#include "modplatform/ModIndex.h"
|
||||||
@ -24,8 +26,7 @@ class Hasher : public Task {
|
|||||||
Hasher(QString file_path, Algorithm alg) : m_path(file_path), m_alg(alg) {}
|
Hasher(QString file_path, Algorithm alg) : m_path(file_path), m_alg(alg) {}
|
||||||
Hasher(QString file_path, QString alg) : Hasher(file_path, algorithmFromString(alg)) {}
|
Hasher(QString file_path, QString alg) : Hasher(file_path, algorithmFromString(alg)) {}
|
||||||
|
|
||||||
/* We can't really abort this task, but we can say we aborted and finish our thing quickly :) */
|
bool abort() override;
|
||||||
bool abort() override { return true; }
|
|
||||||
|
|
||||||
void executeTask() override;
|
void executeTask() override;
|
||||||
|
|
||||||
@ -35,10 +36,13 @@ class Hasher : public Task {
|
|||||||
signals:
|
signals:
|
||||||
void resultsReady(QString hash);
|
void resultsReady(QString hash);
|
||||||
|
|
||||||
protected:
|
private:
|
||||||
QString m_result;
|
QString m_result;
|
||||||
QString m_path;
|
QString m_path;
|
||||||
Algorithm m_alg;
|
Algorithm m_alg;
|
||||||
|
|
||||||
|
QFuture<QString> m_zip_future;
|
||||||
|
QFutureWatcher<QString> m_zip_watcher;
|
||||||
};
|
};
|
||||||
|
|
||||||
Hasher::Ptr createHasher(QString file_path, ModPlatform::ResourceProvider provider);
|
Hasher::Ptr createHasher(QString file_path, ModPlatform::ResourceProvider provider);
|
||||||
|
Loading…
Reference in New Issue
Block a user