35 interruptCondition = std::make_shared<std::condition_variable>();
36 interruptConditionVariable = std::make_shared<bool>();
37 *interruptConditionVariable =
false;
39 this, &ArmarXMultipleObjectsScheduler::schedule,
"ArmarXMultipleObjectsScheduler");
40 scheduleObjectsTask->start();
45 scheduleObjectsTask->stop(
false);
46 interruptCondition->notify_all();
47 scheduleObjectsTask->waitForFinished();
56 std::scoped_lock lock(dataMutex);
57 for (
size_t j = 0; j < schedulers.size();
60 for (
size_t i = j + 1; i < schedulers.size(); ++i)
62 if (schedulers.at(j).get() == schedulers.at(i).get())
75 schedulers.push_back(scheduler);
76 scheduler->setInteruptConditionVariable(interruptCondition,
77 interruptConditionVariable);
83 std::scoped_lock lock(interruptMutex);
84 *interruptConditionVariable =
true;
85 interruptCondition->notify_all();
91 ArmarXMultipleObjectsScheduler::schedule()
93 while (!scheduleObjectsTask->isStopped())
97 std::vector<ArmarXObjectSchedulerPtr> tempSchedulers;
99 std::scoped_lock lock(dataMutex);
100 tempSchedulers = schedulers;
102 std::vector<ArmarXObjectSchedulerPtr> schedulersToErase;
106 auto state = sched->getObjectState();
111 case eManagedIceObjectCreated:
113 if (sched->checkDependenciesResolvement())
115 sched->startObject();
119 case eManagedIceObjectInitializing:
121 case eManagedIceObjectInitialized:
122 if (sched->isTerminationRequested())
125 schedulersToErase.push_back(sched);
127 else if (sched->checkDependenciesResolvement())
129 sched->startObject();
132 case eManagedIceObjectStarting:
134 case eManagedIceObjectStarted:
135 if (sched->isTerminationRequested())
137 sched->disconnectObject();
139 schedulersToErase.push_back(sched);
141 else if (!sched->checkDependenciesStatus())
143 sched->disconnectObject();
147 case eManagedIceObjectExiting:
149 case eManagedIceObjectExited:
156 std::scoped_lock lock(dataMutex);
157 std::reverse(schedulersToErase.begin(), schedulersToErase.end());
158 for (
auto sched : schedulersToErase)
163 for (
auto it = schedulers.begin(); it != schedulers.end(); it++)
165 if (sched.get() == it->get())
167 schedulers.erase(it);
173 std::unique_lock lock(interruptMutex);
175 *interruptConditionVariable =
false;
177 while (!*interruptConditionVariable && !scheduleObjectsTask->isStopped())
179 if (interruptCondition->wait_for(lock, std::chrono::milliseconds(2000)) ==
180 std::cv_status::timeout)