Sleep-Multithreading



  • Hallo,

    ich habe hier schon ziemlich viel zum Thema Multithreading gelesen..jedoch nicht die eigentliche Lösung für mein Problem gefunden.
    Eigentlich ganz einfach:
    Ich habe eine bestimmte Zeit die ich mit z.B. Sleep(50) abwarte. In der Zwischenzeit sollte in einem anderen Thread nehmen wir mal an etwas berechnet werden. Sobald Sleep die 50ms abgewartet hat, sollte die Berechnung sofort unterbrochen werden und an die Sleep stelle gesprungen werden.

    Kleiner Pseudocode wäre nett..

    Danke

    Vielleicht sollte ich noch erwähnen,dass ich keine erfahrung mit MT habe.

    lg



  • 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?

    Windows ist kein Echtzeit-OS - das wirst du nicht überreden können, dir wirklich auf die Millisekunde exakt den Prozessor zu übergeben. Das beste, was du machen kannst, ist die Priorität des Threads hoch genug zu setzen (höher als die deines zweiten Threads), dann bekommt er seine Rechenzeit so schnell wie möglich zu gewiesen.



  • 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 😉 )


  • Mod

    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


  • Mod

    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.


Anmelden zum Antworten