diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp index 308c95e8b6c0b4e9612c3cfc7495a3bbed210077..bbeaa5a4d9a889808db465419f732e5903031a31 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp @@ -570,14 +570,67 @@ namespace armarx void SkillManagerMonitorWidgetController::stopAllExecutions() { - auto tree = widget.treeWidgetSkillExecutions; - ARMARX_INFO << "The user requested to stop all skill executions from GUI."; - for (ssize_t i = 0; i < tree->topLevelItemCount(); ++i) + QTreeWidget const* tree = widget.treeWidgetSkillExecutions; + + int const max_retries = 3; + int left_retries = max_retries; + bool retry = false; + + do { - auto item = static_cast<SkillExecutionInfoTreeWidgetItem*>( - widget.treeWidgetSkillExecutions->topLevelItem(i)); - memory->abortSkillAsync(item->executionId.toManagerIce()); - } + retry = false; + + for (ssize_t i = 0; i < tree->topLevelItemCount(); ++i) + { + SkillExecutionInfoTreeWidgetItem const* item = + dynamic_cast<SkillExecutionInfoTreeWidgetItem*>( + widget.treeWidgetSkillExecutions->topLevelItem(i)); + + if (not item) + { + // At this point, dynamic-casting failed and we don't know anything about the + // type. + ARMARX_ERROR << "Cannot stop unknown skill."; + retry = true; + continue; + } + + try + { + ARMARX_INFO << "Aborting skill '" << item->executionId.skillId.skillName + << "'..."; + memory->abortSkillAsync(item->executionId.toManagerIce()); + } + catch (Ice::Exception const& e) + { + retry = true; + ARMARX_ERROR << "Unhandeled Ice exception while aborting skill '" + << item->executionId.skillId.skillName << "'."; + } + catch (...) + { + retry = true; + ARMARX_ERROR << "Unhandled error while aborting skill '" + << item->executionId.skillId.skillName << "'."; + } + } + + if (retry) + { + left_retries -= 1; + + if (left_retries > 0) + { + ARMARX_WARNING << "There where errors aborting skills. Retrying..."; + } + else + { + ARMARX_ERROR << "Couldn't abort all skills after " << max_retries + << " tries. Giving up."; + retry = false; + } + } + } while (retry); } void