Это то, что я пытаюсь достичь:таймаута Т трубопровод фильтр
Я использую TBB's
конвейер для обработки. У меня есть несколько фильтров в конвейере, и мне нужно, чтобы фильтры были как можно быстрее, так как это приложение реального времени. Один из фильтров может занимать больше времени, чем я могу себе позволить, поэтому я хочу как-то установить тайм-аут на этом конкретном фильтре.
Посмотрев некоторое время я нашел следующее решение, которое работает в целом, но имеет свои проблемы:
Когда фильтр будет создан, создать мероприятие HANDLE
m_Event = CreateEvent(NULL, FALSE, FALSE, NULL);
Затем фильтр вызывает функцию с помощью асинхр и ждет на мероприятии
...
auto funcBind = std::bind(&MyFunc, ...)
auto function = std::async(std::launch::async, funcBind, m_Event ...);
long res = WaitForSingleObject(m_Event, delayMS);
auto myFuncRes = function.get()
if (res == WAIT_OBJECT_0 && (bool)myFuncRes)
{
// MyFunc Finished successfuly
}
else if (res == WAIT_TIMEOUT)
{
// Timeout expired
}
else
{
// MyFunc failed
}
...
return;
Как раз перед функцией MyFunc
возвращается, она сигнализирует мероприятия
SetEvent(event);
Так что теперь, если истекает delayMS
таймаута, то Т фильтр не задерживает весь трубопровод. Проблема в том, что MyFunc
все еще работает в фоновом режиме, это не останавливается.
Мой вопрос: есть ли лучший способ установить тайм-аут на TBB-фильтр, и есть ли решение остановить выполнение MyFunc
после достижения таймаута (я бы предпочел не использовать таймеры или таймеры внутри него, возможно, каким-то образом использовать событие и проверить, было ли оно взято фильтром или что-то в этом роде)
Спасибо. Отменяет ли task_group прекращение конвейера? Потому что я хочу только остановить длинный фильтр определенного шага. Я хочу, чтобы конвейер продолжался, как обычно, после этого –
Нет, если вы запустили и отменили только фильтр в контексте task_group или другой области 'task_group_context :: isolated', а не контекст всего конвейера. Это означает, что внутри функтора фильтра вы хотите запустить другой вложенный алгоритм, например 'task_group :: run_and_wait()', чтобы он выполнялся в другом контексте – Anton