Я Я работаю с двумя разными библиотеками (поэтому я не могу изменить этот код), каждая из которых предоставляет классы, подобные этим:
Код: Выделить всё
// Call to do the "work"
class LongRunner
{
public:
void runForAwhile();
// Only interrupts runForAwhile() if it is currently running.
// Doesn't do anything otherwise (ie, can still be called)
void stopRunner();
};
// Override to define execution
class ExecutionBase
{
public:
virtual void executeInSeparateThread();
// Joins the execution thread. Can be overridden for additional cleanup.
virtual void halt();
};
Код: Выделить всё
class MyExecution : ExecutionBase
{
public:
void executeInSeparateThread() override
{
doBeforeThings();
long_runner_.runForAwhile();
doAfterThings();
}
void halt() override
{
long_runner_.stopRunner();
ExecutionBase::halt();
}
private:
LongRunner long_runner_;
};
Трюк, который меня сбивает с толку, заключается в том, что stopRunner()< /code> прерывает runForA while(), только если он выполняется в данный момент. Таким образом, если функция stopRunner() вызывается вhalt(), а runForA while() еще не запущена, синхронизация потоков должна гарантировать, что она никогда не запустится.В этом вопросе нет необходимости, но если вам интересно, LongRunner на самом деле является moveit::task_constructor::Task (
Код: Выделить всё
plan()Подробнее здесь: https://stackoverflow.com/questions/791 ... ing-method
Мобильная версия