Unendliche Loops abbrechen ?
-
Hallo,
ich habe einen fremden Code der leider ab und zu einen unendlichen Loop
zusammenbastelt, sodass er aus der von mir aufgerufenen Funktion nicht
mehr zurückkehrt.Sagen mir mal der fremde Code sieht irgendwie so aus:
while(1==1){Sleep(10);}Ich suche nun nach einer Methode eine Funktion mit einem Timeout aufzurufen,
sodass ich nach z.B. 1 Sekunde zurückkehre.
In erster Linie wollt ich einen Thread starten, der mir das irgendwie tun
sollte, aber eine Thread Erzeugung dauert in meinem Fall zu lange, es muss
also schnell sein. (natürlich bis auf einen Fehlerfall, da bricht es eh ab)Kenn jemand solche Methoden ? Unter was für Oberbegriffe muss man hier suchen ?
Ungefähr so stelle ich mir das vor:
DieTimeoutFunktion(DummeLoopFunktion(parameter),meineAbbruchzeit);Ich denke da and die overlapped Funktionen aus den ComPort Bereich ...
Gruss
thenoname
-
also du sagst, thread erstellen dauert zu lange? dann läuft die funktion aber wirklich nicht lange, oder?
Auf alle Fälle geht das glaub ich nur mit threads, ob nu im hintergrund oder du machst es selber. Ich würd folgendes vorschlagen:
Erstelle einen Thread, der meldet dann dem hauptprogramm, dass er jetzt fertig initialisiert ist. Das Hauptprogramm setzt ein Flag und der Thread startet die DummeLoopFunktion(), und beendet sich dann. Wenn der Thread dann aber nach 1s oder so nicht beednet ist, kann das Hauptorgramm ihn mit tmerinateThread oder sowas beenden.
-
Ja, leider dauert es extrem lange, bis ein Thread anfängt.
Wenn du 50 mal pro Sekunde die "DummeLoopFunktion" brauchst, ist es ein absolutes Unding.Bei Threads hab ich auch das Problem, das ich mich mit den Parametern in einer
falschen (ich hoffe ich schreibe es richtig) Instanz befinde und diese z.B. in einer
mehrfach aufgerufenen DLL den Bezug zum Rest des Speichers verlieren.
(hmmm, hoffe das versteht jemand ...)
-
aber ohne threads geht es definitiv nicht. Ob du nu davon was mitbekommst is ne andere sache. Ein PC kann nciht mehrere Aufruf-Stränge in einem Thread ausführen. und du brauchst ja einen, der die zeit misst und einen, der die funktion ausführt.
Wenn du allerdings an den fremden Code rankommst, also direkt an den Quellcode, dann kannst du da die zeitmessung auch direkt einbauen.
Bau doch einen thread und nur, wenn die funktion ewig braucht, dann brich den thread ab und erstelle einen neuen. Ansonsten beendet sich der thread eben nciht sondern setzt nur ein flag dass erfertig ist. aber irge3ndwie ist das alles nur gefrickel. am besten du überarbeitest die fremde Funktion.
-
startTime = getTime() while(getTime() - startTime < 1000)) { }
-
ich habe einen fremden Code == while(1==1){Sleep(10);} == nicht veränderbar, weil nicht von mir (DLL Funktion)
Echt verzwickt das Ganze

-
Und wenn du den Thread nur einmal startest?
Wenn sich dieser nicht nach dem beenden des Loops auch beendet kannst du oihn ja für den nächsten Aufruf "recyclen"
-
Das Problem dabei ist, das die Ausführung eines neuen Zykluss nur durch ein
Flag zum Thread gesendet werden kann, und bis der Thread das mitbekommt
(Taskprozzersorleistungsverteilung) ist es leider manchmal zu spät.
-
Du könntest, jetzt mal windows vorausgesetzt den Thread brutal mit SetThreadContext aus der Funktion rausreißen, und dann den Thread weiter benutzen...