Das ist, was ich versuche zu erreichen:Timeout ein TBB-Pipeline Filter
Ich TBB's
Pipeline zur Verarbeitung verwendet wird. Ich habe mehrere Filter in der Pipeline und ich brauche die Filter so schnell wie möglich, da dies eine Echtzeitanwendung ist. Einer der Filter kann manchmal länger dauern, als ich es mir leisten kann, also möchte ich irgendwie einen Timeout für diesen bestimmten Filter setzen.
Nachdem er eine Weile suchen fand ich die folgende Lösung, die in der Regel funktioniert, aber hat seine Probleme:
Wenn die Filter erstellt wird, erstelle ich ein Ereignis HANDLE
m_Event = CreateEvent(NULL, FALSE, FALSE, NULL);
die Filter dann, async und wartet auf das Ereignis ruft eine Funktion
...
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;
Kurz bevor die Funktion MyFunc
kehrt es unter Verwendung der Signale Ereignis
SetEvent(event);
So, jetzt, wenn das delayMS
Timeout abläuft, werden die TBB-Filter die gesamte Pipeline nicht verzögern. Das Problem ist, dass MyFunc
immer noch im Hintergrund läuft, es hört nicht auf.
Meine Frage ist, gibt es eine bessere Möglichkeit, ein Timeout für einen TBB-Filter zu setzen, und gibt es eine Lösung zum Beenden MyFunc
Ausführung, sobald ein Timeout erreicht wurde (Ich würde lieber keine Timer oder Timing-Prüfungen verwenden innerhalb es, vielleicht irgendwie, um das Ereignis zu verwenden und zu überprüfen, ob es durch den Filter oder etwas genommen wurde)
Danke. Wird durch das Abbrechen der task_group die Pipeline gestoppt? Weil ich nur den langen Filter des spezifischen Schrittes stoppen möchte. Ich möchte, dass die Pipeline wie gewohnt weitergeht –
Nein, wenn Sie nur Filter im Kontext von task_group oder anderen 'task_group_context :: isolated' Bereich ausführen und abbrechen und nicht den Kontext der gesamten Pipeline. Es bedeutet, dass Sie innerhalb des Filter-Funktors einen anderen verschachtelten Algorithmus wie 'task_group :: run_and_wait()' ausführen wollen, so dass er in einem anderen Kontext ausgeführt wird – Anton