1 2 #include "AsyncTask.h" 3 AsyncTask()4AsyncTask::AsyncTask() 5 : QObject(nullptr), 6 QRunnable() 7 { 8 setAutoDelete(false); 9 running = false; 10 } 11 ~AsyncTask()12AsyncTask::~AsyncTask() 13 { 14 wait(); 15 } 16 wait()17void AsyncTask::wait() 18 { 19 runningMutex.lock(); 20 runningMutex.unlock(); 21 } 22 wait(int timeout)23bool AsyncTask::wait(int timeout) 24 { 25 bool r = runningMutex.tryLock(timeout); 26 if (r) { 27 runningMutex.unlock(); 28 } 29 return r; 30 } 31 interrupt()32void AsyncTask::interrupt() 33 { 34 interrupted = true; 35 } 36 prepareRun()37void AsyncTask::prepareRun() 38 { 39 interrupted = false; 40 wait(); 41 timer.start(); 42 } 43 run()44void AsyncTask::run() 45 { 46 runningMutex.lock(); 47 48 running = true; 49 50 logBuffer.clear(); 51 emit logChanged(logBuffer); 52 runTask(); 53 54 running = false; 55 56 emit finished(); 57 58 runningMutex.unlock(); 59 } 60 log(QString s)61void AsyncTask::log(QString s) 62 { 63 logBuffer += s.append(QLatin1Char('\n')); 64 emit logChanged(logBuffer); 65 } 66 AsyncTaskManager(QObject * parent)67AsyncTaskManager::AsyncTaskManager(QObject *parent) 68 : QObject(parent) 69 { 70 threadPool = new QThreadPool(this); 71 } 72 ~AsyncTaskManager()73AsyncTaskManager::~AsyncTaskManager() 74 { 75 } 76 start(AsyncTask::Ptr task)77void AsyncTaskManager::start(AsyncTask::Ptr task) 78 { 79 tasks.append(task); 80 task->prepareRun(); 81 82 QWeakPointer<AsyncTask> weakPtr = task; 83 connect(task.data(), &AsyncTask::finished, this, [this, weakPtr]() { 84 tasks.removeOne(weakPtr); 85 emit tasksChanged(); 86 }); 87 threadPool->start(task.data()); 88 emit tasksChanged(); 89 } 90 getTasksRunning()91bool AsyncTaskManager::getTasksRunning() 92 { 93 return !tasks.isEmpty(); 94 } 95