mirror of
https://github.com/rizinorg/cutter.git
synced 2024-12-22 12:56:11 +00:00
95 lines
1.4 KiB
C++
95 lines
1.4 KiB
C++
|
|
#include "AsyncTask.h"
|
|
|
|
AsyncTask::AsyncTask()
|
|
: QObject(nullptr),
|
|
QRunnable()
|
|
{
|
|
setAutoDelete(false);
|
|
running = false;
|
|
}
|
|
|
|
AsyncTask::~AsyncTask()
|
|
{
|
|
wait();
|
|
}
|
|
|
|
void AsyncTask::wait()
|
|
{
|
|
runningMutex.lock();
|
|
runningMutex.unlock();
|
|
}
|
|
|
|
bool AsyncTask::wait(int timeout)
|
|
{
|
|
bool r = runningMutex.tryLock(timeout);
|
|
if (r) {
|
|
runningMutex.unlock();
|
|
}
|
|
return r;
|
|
}
|
|
|
|
void AsyncTask::interrupt()
|
|
{
|
|
interrupted = true;
|
|
}
|
|
|
|
void AsyncTask::prepareRun()
|
|
{
|
|
interrupted = false;
|
|
wait();
|
|
timer.start();
|
|
}
|
|
|
|
void AsyncTask::run()
|
|
{
|
|
runningMutex.lock();
|
|
|
|
running = true;
|
|
|
|
logBuffer = "";
|
|
emit logChanged(logBuffer);
|
|
runTask();
|
|
|
|
running = false;
|
|
|
|
emit finished();
|
|
|
|
runningMutex.unlock();
|
|
}
|
|
|
|
void AsyncTask::log(QString s)
|
|
{
|
|
logBuffer += s + "\n";
|
|
emit logChanged(logBuffer);
|
|
}
|
|
|
|
AsyncTaskManager::AsyncTaskManager(QObject *parent)
|
|
: QObject(parent)
|
|
{
|
|
threadPool = new QThreadPool(this);
|
|
}
|
|
|
|
AsyncTaskManager::~AsyncTaskManager()
|
|
{
|
|
}
|
|
|
|
void AsyncTaskManager::start(AsyncTask::Ptr task)
|
|
{
|
|
tasks.append(task);
|
|
task->prepareRun();
|
|
|
|
QWeakPointer<AsyncTask> weakPtr = task;
|
|
connect(task.data(), &AsyncTask::finished, this, [this, weakPtr]() {
|
|
tasks.removeOne(weakPtr);
|
|
emit tasksChanged();
|
|
});
|
|
threadPool->start(task.data());
|
|
emit tasksChanged();
|
|
}
|
|
|
|
bool AsyncTaskManager::getTasksRunning()
|
|
{
|
|
return !tasks.isEmpty();
|
|
}
|