Funktion mit Timeout
-
Hallo NG,
ich moechte eine eigene Funktion mit einem Timeout-Parameter erstellen,
damit der Vorgang nach einer gewissen Zeit abgebrochen wird.
Also der Aufruf sieht dann z.B. so aus:...
int nTimeout = 5000; // milliseconds
myObject.DoSomething(...., nTimout);
...Meine Ueberlegung:
In der Funktion "DoSomething" muesste ein asynchrones Verhalten
erzeugt werden und ein Abbruch erfolgen, wenn der Timeout erreicht ist.Also ein Thread anlegen und ein Event setzen wenn der Timeout erreicht ist.
Ist das der richtige Weg oder gehts auch einfacher (z.B. mit einem asynchronen
Timer)?Vielen Dank fuer HInweise und Tipps.
-
Hallo NG,
ist meine Frage zu undurchsichtig gestellt oder hat noch niemand
eine eigene Funktion mit Timeout-Verhalten geschrieben?
-
Klar. Vermutlich ist die Frage zu trivial.
Einfach in Deiner Funktion ein paar häufig aufgerufene Stellen mit einem Test von GetTickCount und Startzeit einbauen und einen return einbauen...
Wenn es komplexer wird kanst Du ja auch eine Exception werfen, wenn das Timeout erreicht ist.
Du wirst aber nicht drum herum kommen selbst zu testen, wann es so weit ist.PS: Von üblen Dingen wie TerminateThread kann ich nur abraten...
-
Hallo Martin,
danke fuer die Antwort.
Vielleicht habe ich mich doch ungenau ausgedrueckt, denn ganz so trivial
ist es aus meiner Sicht nicht.Wenn ich in meiner Funktion "DoSomething" selbst irgendwo eine Unterfunktion
aufrufe und auf die warten muß, dann hilft mir ein GetTickCount ja nicht weiter.
Das habe ich gemeint, einen Async-Wrapper um eine Sync-Funktion zu bauen.Da brauche ich einen Thread der nach dem Timout sofort beendet werden muss...
Aber wie? TerminateThread scheidet aus wie Du ja selbst gesagt hast.
Wie machts man aber richtig?
-
Wenn Du innerhalb deiner Funktion wiederrum selbst auf eine andere Funktion warten musst, die keinen "Timeout-Parameter" hat, dann funktioniert deine Idee nicht. Die andere Funktion muss sich ja schliesslich auch irgendwie abbrechen lassen.
-
Willst du denn wirklich auf die ms genau nach der angegebenen Zeit abbrechen? Macht das Sinn? Was macht deine Funktion denn? Oft ist es sinnvoll, den aktuellen Arbeitsschritt noch zu beenden, bevor man abbricht. Simples Beispiel: du bearbeitest irgendwelche Datensätze in einer Schleife. Da willst du nicht bei Feld 2 von 4 abbrechen und einen nur halb bearbeiteten Datensatz zurücklassen. Daher wartet man lieber bis zum erneuten Schleifendurchlauf und beendet dann sauber, wenn auch eventuell ein paar ms später als angegeben.
Du solltest einfach etwas konkreter werden, was deine Funktion betrifft. Macht es überhaupt Sinn, sie mittendrin zu beenden? Wie lange dauert ein Arbeitsschritt überhaupt (bei 5ms brauchen wir nicht weiterzureden, pack ne Abfrage an den Schleifenanfang und gut is')?
-
Ok, danke fuer die Antwort.
-
Hallo _matze,
danke fuer die Antwort.
Das stimmt alles was Du sagst, aber dass ist nicht das Problem.
Das Problem ist wenn ich in meiner Funktion selbst eine synchrone
Funktion aufrufe und warte und warte und warte...Man koennte meine Funktion "DoSomething" in einen Thread auslagern und
nach "timeout" dann den Thread mit der Holzhammermethode killen.
Das ist aber nicht sauber und bringt evtl. weitere Probleme mit sich (wie
Martin schon gewarnt hat).Deshalb gibst eigentlich keine Loesung so lange meine Funktion nicht auch
eine async-Funktion aufruft -> ein Denkfehler meinerseits.Danke an alle fuer die Antworten.