64 lines
1.1 KiB
C++
64 lines
1.1 KiB
C++
#include "QueuedBackgroundTask.h"
|
|
#include "ScopeGuard.h"
|
|
|
|
//void QueuedBackgroundTask::requestPause()
|
|
//{}
|
|
|
|
QueuedBackgroundTask::QueuedBackgroundTask(CompletionFunction on_completion)
|
|
: m_completionFunction(std::move(on_completion))
|
|
{
|
|
setAutoDelete(false);
|
|
}
|
|
|
|
QueuedBackgroundTask::~QueuedBackgroundTask()
|
|
{
|
|
cancel();
|
|
wait();
|
|
}
|
|
|
|
void QueuedBackgroundTask::cancel()
|
|
{
|
|
QMutexLocker lock(&stateMutex);
|
|
if (!m_finished)
|
|
m_canceled = true;
|
|
}
|
|
|
|
void QueuedBackgroundTask::wait()
|
|
{
|
|
QMutexLocker lock(&stateMutex);
|
|
if (!m_finished)
|
|
finished.wait(&stateMutex);
|
|
}
|
|
|
|
bool QueuedBackgroundTask::hasException() const
|
|
{
|
|
return doRunException != nullptr;
|
|
}
|
|
|
|
void QueuedBackgroundTask::rethrow()
|
|
{
|
|
std::rethrow_exception(doRunException);
|
|
}
|
|
|
|
void QueuedBackgroundTask::run()
|
|
{
|
|
SCOPE_EXIT {
|
|
m_finished = true;
|
|
QMutexLocker lock(&stateMutex);
|
|
finished.notify_all();
|
|
};
|
|
QMutexLocker lock(&stateMutex);
|
|
m_started = true;
|
|
if (!m_canceled) {
|
|
lock.unlock();
|
|
try {
|
|
doRun();
|
|
}
|
|
catch (...) {
|
|
doRunException = std::current_exception();
|
|
}
|
|
|
|
if (!m_canceled && m_completionFunction)
|
|
m_completionFunction(this);
|
|
}
|
|
}
|