logic: terminating all running tasks before closing the application (issue #343)

This commit is contained in:
malte_langkabel
2017-04-12 10:46:56 +02:00
parent 0e4b606c7c
commit 6e342fa87c
23 changed files with 127 additions and 25 deletions
+5
View File
@@ -54,3 +54,8 @@ void TaskParseWrapper::doReset(std::shared_ptr<Blackboard> blackboard)
{
m_taskRunner->reset();
}
void TaskParseWrapper::doTerminate()
{
m_taskRunner->terminate();
}
+1
View File
@@ -28,6 +28,7 @@ private:
virtual TaskState doUpdate(std::shared_ptr<Blackboard> blackboard);
virtual void doExit(std::shared_ptr<Blackboard> blackboard);
virtual void doReset(std::shared_ptr<Blackboard> blackboard);
virtual void doTerminate();
PersistentStorage* m_storage;
+5
View File
@@ -1,5 +1,10 @@
#include "utility/ScopedFunctor.h"
ScopedFunctor::ScopedFunctor()
: m_onDestroy([](){})
{
}
ScopedFunctor::ScopedFunctor(std::function<void(void)> onDestroy)
: m_onDestroy(onDestroy)
{
+1
View File
@@ -6,6 +6,7 @@
class ScopedFunctor
{
public:
ScopedFunctor();
ScopedFunctor(std::function<void(void)> onDestroy);
~ScopedFunctor();
+5
View File
@@ -48,3 +48,8 @@ void Task::reset(std::shared_ptr<Blackboard> blackboard)
m_enterCalled = false;
m_exitCalled = false;
}
void Task::terminate()
{
}
+1
View File
@@ -23,6 +23,7 @@ public:
TaskState update(std::shared_ptr<Blackboard> blackboard);
void reset(std::shared_ptr<Blackboard> blackboard);
virtual void terminate(); // caution: this should only be called just before quitting the app.
private:
virtual void doEnter(std::shared_ptr<Blackboard> blackboard) = 0;
@@ -13,3 +13,8 @@ std::shared_ptr<TaskDecorator> TaskDecorator::addChildTask(std::shared_ptr<Task>
setTask(child);
return shared_from_this();
}
void TaskDecorator::terminate()
{
doTerminate();
}
@@ -15,6 +15,10 @@ public:
std::shared_ptr<TaskDecorator> addChildTask(std::shared_ptr<Task> child);
virtual void setTask(std::shared_ptr<Task> task) = 0;
virtual void terminate();
private:
virtual void doTerminate() = 0;
};
#endif // TASK_DECORATOR_H
@@ -48,3 +48,8 @@ void TaskDecoratorRepeat::doReset(std::shared_ptr<Blackboard> blackboard)
{
m_taskRunner->reset();
}
void TaskDecoratorRepeat::doTerminate()
{
m_taskRunner->terminate();
}
@@ -24,6 +24,7 @@ private:
virtual TaskState doUpdate(std::shared_ptr<Blackboard> blackboard);
virtual void doExit(std::shared_ptr<Blackboard> blackboard);
virtual void doReset(std::shared_ptr<Blackboard> blackboard);
virtual void doTerminate();
std::shared_ptr<TaskRunner> m_taskRunner;
const ConditionType m_condition;
+6 -1
View File
@@ -27,4 +27,9 @@ std::shared_ptr<TaskGroup> TaskGroup::addChildTasks(std::shared_ptr<Task> child1
addTask(child2);
addTask(child3);
return shared_from_this();
}
}
void TaskGroup::terminate()
{
doTerminate();
}
+4
View File
@@ -18,6 +18,10 @@ public:
std::shared_ptr<TaskGroup> addChildTasks(std::shared_ptr<Task> child1, std::shared_ptr<Task> child2, std::shared_ptr<Task> child3);
virtual void addTask(std::shared_ptr<Task> task) = 0;
virtual void terminate();
private:
virtual void doTerminate() = 0;
};
@@ -73,6 +73,19 @@ void TaskGroupParallel::doReset(std::shared_ptr<Blackboard> blackboard)
}
}
void TaskGroupParallel::doTerminate()
{
for (size_t i = 0; i < m_tasks.size(); i++)
{
m_tasks[i]->taskRunner->terminate();
if (m_tasks[i]->thread)
{
m_tasks[i]->thread->detach();
m_tasks[i]->thread.reset();
}
}
}
void TaskGroupParallel::processTaskThreaded(std::shared_ptr<TaskInfo> taskInfo, std::shared_ptr<Blackboard> blackboard)
{
ScopedFunctor functor([&](){
@@ -33,6 +33,7 @@ private:
virtual TaskState doUpdate(std::shared_ptr<Blackboard> blackboard);
virtual void doExit(std::shared_ptr<Blackboard> blackboard);
virtual void doReset(std::shared_ptr<Blackboard> blackboard);
virtual void doTerminate();
void processTaskThreaded(std::shared_ptr<TaskInfo> taskInfo, std::shared_ptr<Blackboard> blackboard);
int getActveTaskCount() const;
@@ -54,3 +54,11 @@ void TaskGroupSelector::doReset(std::shared_ptr<Blackboard> blackboard)
m_taskRunners[i]->reset();
}
}
void TaskGroupSelector::doTerminate()
{
for (size_t i = 0; i < m_taskRunners.size(); i++)
{
m_taskRunners[i]->terminate();
}
}
@@ -18,6 +18,7 @@ private:
virtual TaskState doUpdate(std::shared_ptr<Blackboard> blackboard);
virtual void doExit(std::shared_ptr<Blackboard> blackboard);
virtual void doReset(std::shared_ptr<Blackboard> blackboard);
virtual void doTerminate();
std::vector<std::shared_ptr<TaskRunner>> m_taskRunners;
int m_taskIndex;
@@ -54,3 +54,11 @@ void TaskGroupSequence::doReset(std::shared_ptr<Blackboard> blackboard)
m_taskRunners[i]->reset();
}
}
void TaskGroupSequence::doTerminate()
{
for (size_t i = 0; i < m_taskRunners.size(); i++)
{
m_taskRunners[i]->terminate();
}
}
@@ -18,6 +18,7 @@ private:
virtual TaskState doUpdate(std::shared_ptr<Blackboard> blackboard);
virtual void doExit(std::shared_ptr<Blackboard> blackboard);
virtual void doReset(std::shared_ptr<Blackboard> blackboard);
virtual void doTerminate();
std::vector<std::shared_ptr<TaskRunner>> m_taskRunners;
int m_taskIndex;
@@ -26,4 +26,13 @@ void TaskRunner::reset()
m_reset = true;
}
void TaskRunner::terminate()
{
if (m_task)
{
m_task->terminate();
}
}
+2 -1
View File
@@ -13,10 +13,11 @@ public:
Task::TaskState update(std::shared_ptr<Blackboard> blackboard);
void reset();
void terminate(); // caution: this should only be called just before quitting the app.
private:
std::shared_ptr<Task> m_task;
bool m_reset;
};
#endif // TASK_H
#endif // TASK_RUNNER_H
@@ -161,6 +161,7 @@ void TaskScheduler::processTasks()
if (!m_loopIsRunning)
{
runner->terminate();
break;
}
}