logic: terminating all running tasks before closing the application (issue #343)
This commit is contained in:
@@ -48,3 +48,8 @@ void Task::reset(std::shared_ptr<Blackboard> blackboard)
|
||||
m_enterCalled = false;
|
||||
m_exitCalled = false;
|
||||
}
|
||||
|
||||
void Task::terminate()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user