Sleep-Multithreading
-
Hallo
Habe ich das richtig verstanden? Thread 1 legt sich schlafen und erwartet am Ende dieser Schlafphase sofort das Kommando übernehmen zu können? Wie genau müssen denn diese Zeitbedingungen eingehalten werden?
Ich versuche einfach die best-mögliche Lösung zu finden. Wenn nicht in 1 ms, dann hald in 3 oder 4.
Das mit dem RTOS ist schon klar..
Mir geht es jetzt aber vor allem darum, den Multithread-Algorithmus auf dieses Bsp hin zu verstehen..?lg
-
Die bestmögliche Lösung wird es wohl sein, die Prioritäten etwas nachzujustieren. Der Scheduler gibt den aktiven Threads nach bestimmten Regeln nacheinander die Rechenzeit (solange du kein Multi-Prozessor-System hast, kann immer nur ein Thread zur selben Zeit arbeiten, der Rest muß warten, bis er dran ist) - je höher die Priorität eines Threads ist, desto größer sind seine Chancen, an die Reihe zu kommen.
Durch das Sleep() wird dein Thread inaktiv geschaltet und nach der angegebenen Zeit wieder reaktiviert (wenn er wichtig genug ist, wird ihm das System bei nächster Gelegenheit den Prozessor überlassen).
-
ok,
kann ich dann aber davon ausgehn, dass mein Programm (wie immer mit möglichem Verzug) während meines Sleep() die Berechnung ausführt und nicht sonst irgentwas macht?... deshalb eben die Frage bezüglich dem Multithread. Denn nach dem die Sleep()-Time vorbei ist wird sie wieder gestartet und es muss bereits eine weitere Berechnung durchgeführt werden.lg
-
Wieviel Zeit dein Arbeitsthread von diesen 50ms tatsächlich abbekommt, lässt sich nur schwer einschätzen (schau mal in den Task-Manager - du wirst dich wundern, wer auf deinem Computer alles Rechenzeit beansprucht).
Allerdings: Wenn der zweite Thread nach der Unterbrechung wieder an die Reihe kommt, macht er genau dort weiter, wo er aufgehört hat - außer natürlich, du hast ihn vorher pulverisiert, aber das wäre extrem unhöflich

(PS: Kannst du deine Grund-Konstellation mal etwas genauer erklären?)
-
(PS: Kannst du deine Grund-Konstellation mal etwas genauer erklären?)
Ich muss in einem zyklischen takt etwas ausgeben.
-Takt beginnt->sleep beginnt zu zählen
-(jetzt mein problem->das wechseln in diesen thread) in einem anderen Thread erfolgt die ausgabe
-Sleep() hat fertig->ich springe an dessen stelle, mache eine kurze berechnung und starte Sleep() vom neuen.. and so on
-
Du meinst, der Ausgabethread soll eine Meldung ausgeben und dann warten, daß der Hauptthread mit der nächsten "Runde" begonnen hat? Dann mußt du die beiden Threads richtig miteinander synchronisieren (per Events):
//Thread 1: while(1) { //rechne etwas aus evt_output.SetEvent(); Sleep(50); } //Thread 2: while(1) { WaitForSingleObject(evt_output,INFINITE); //gib Daten aus }
-
ja genau

Danke ertmals CStoll
(wahrscheinlich werd ich mich eh schon bald wieder melden
)
-
Bist Du denn von dem Hauptthread abhängig?
Oder genügt es nicht einfach 50msec zu warten und dann wieder zu arbeiten?
-
Bist Du denn von dem Hauptthread abhängig?
Oder genügt es nicht einfach 50msec zu warten und dann wieder zu arbeiten?Du meinst, dass ich die Ausgabe abwarte, die 50ms abwarte und wieder ausgebe?
Das funktioniert leider nicht, da die "Ausgabe" wahrscheinlich so lange dauern wird-dessen Zeit nicht vernachlässigt werden darf
-
Selbst das bekommst Du doch in.
GetTickCount machen wann die letzte Ausgabe erfolgte (begann).
Sleep einfach solange durchführen 50-ZeitSeitLetzterAusgabe.
Evtl. gar keinen Sleep durchführen wenn schon 50msec rum sind.