Kürzere Pause als Sleep(1)???



  • Hallo,

    ich hatte diese Frage schon mal gestellt, kann den Thread aber nicht mehr finden.
    Jedenfalls benötige ich mehrere Threads, die in einer Schleife laufen. Um die Systemauslastung nicht unnötig hoch zutreiben, setzte ich in jede Schleife eine Pause von 1 ms.

    Nun ist es so, daß die Anwendung sehr zeitkritisch ist, und ich die Schleife etwas öfter durchlaufen müsste. Mit einer Pause von 0,5 ms wäre mir daher schon sehr geholfen. Vielleicht gibt es da ja was? Danke schon mal.

    Grüße
    Franky

    PS: In dem alten Thread stand von jemanden ein Link zu einem interessanten Artikel zu diesem Thema. Weiß den allerdings nicht mehr.



  • Sleep(0)

    gibt die restliche Prozessorzeit des Threats ab.



  • Hi Purll,

    das ist schon richtig. Ändert aber nichts daran, dass das System trotzdem mit 100% ausgelastet. Genau das wollte ich mit Sleep(1) ja vermeiden.

    Meine Anwendung soll quasi im Hintergrund laufen und daher so wenig Prozessorzeit wie möglich in Anspruch nehmen.

    Grüße
    Franky



  • ist vielleicht fuer dich ein Mutex ne loesung?



  • oder Event?



  • http://www.bytesandmore.de/rad/cpp/snipp/sc06025.php

    [ Dieser Beitrag wurde am 05.02.2003 um 16:37 Uhr von flosko editiert. ]



  • Die Zeit genauer messen kann man mit QueryPerformanceCounter()/QueryPerformanceFrequency(). Daraus könnte man sich eine genauere Sleep-Funktion basteln
    edit: einer zuvogekommen 😉

    [ Dieser Beitrag wurde am 05.02.2003 um 16:40 Uhr von crass editiert. ]



  • Genau das macht das Snippet von flosko... (hab's jetzt nur schnell überflogen, also bitte nicht hauen, wenn's doch was anderes macht ;))

    cya 🙂



  • Original erstellt von crass:
    Die Zeit genauer messen kann man mit QueryPerformanceCounter()/QueryPerformanceFrequency(). Daraus könnte man sich eine genauere Sleep-Funktion basteln

    Ist aber unsauber und auf keinen Fall genau, da du in bestimmten Intervallen nachfragen musst: Ist die Zeit schon abgelaufen???



  • aber Sleep(1) ist genau, oder wie 😃

    ne, ne :p



  • Ich habe mal die Sleep- Funktion mit dem HighPerformanceCounter überprüft. Bei Sleep(1) kommt auch zeimlich genau 1ms Verzögerung bei raus. Da war ich auch ein wenig (positiv) überracht. Wogegen der normale API- Timer bei der Einstellung 1ms nur eine maximale Auflösung von 10ms schafft.

    Die Lösung mit dem HighPerformanceCounter habe ich mir auch schon überlegt. Jedoch tritt genau das Problem auf, welches MaSTaH beschrieben hat.

    Was ist ein Mutex???

    Grüße
    Franky

    PS: Wenn ich doch bloß den Link noch hätte?



  • Aha, nach ein bisschen googeln habe ich den Artikel wieder gefunden.
    Wen es interessiert:
    http://www.codeguru.com/system/CreatingAHigh.html

    Vielleicht bekomme ich damit ja etwas hingebogen...

    Grüße
    Franky

    [ Dieser Beitrag wurde am 05.02.2003 um 21:15 Uhr von Franky editiert. ]



  • Hmm, schade eigentlich. Habe gerade gesehen, daß die in dem Link gezeigte Timer- Klasse die API- Funktion timesetevent benutzt. Und die ist auch auf 1ms begrenzt.

    Also weitersuchen... - Da muß es doch irgendetwas geben!!!

    Grüße
    Franky



  • ähm, ich hab zwar auch keine lösung, aber wegen dem Spleep muß ich jetzt schon noch mal nachhaken 😃 Wenn bei Sleep(Bla) ziemlich genau Bla raus kommt ist das auch ziemlich viel zufall! da weil:

    [Bla] is the minimum time interval for which execution is to be suspended, in milliseconds

    achtung: the minimum

    da kann ich mir mit QueryPerformanceBla eine viel bessere Sleep funktion bauen, bei der ich auch noch händisch die zeit wieder angleichen kann, wenn er mal länger/kurzer warten mußte/sollte/durfte!

    ganz allgemein: zeitkritisch und Sleep, das paßt überhaupt net zusammen, noch nicht mal wenns sekundengenau sein soll!

    ich hab bei mir auf arbeit vielleicht noch son kleines proggi wo ich mal die Sleep funktion getestet hab. also Sleep(1000)in nem thread und die aktuelle systemzeit in nem anderen thread. du wirst nicht glauben auf wievielen systemen die zeit auch nach tagen noch mit der 'Sleepzeit' übereinstimmt, aber es gibt genausoviele systeme auf denen schon nach wenigen minuten unterschiede von mehreren sekunden auftreten. liegt wirklich, daran wieviel los ist und welche hardware du hast...



  • Hi RPD,

    das hört sich ja gar nicht gut an. Ich habe jedenfalls ein Programm gebastelt, welches in einer Schleife läuft und jedesmal Sleep(1) aufruft. Davor und danach habe ich die Ticks aufgenommen, dann umgerechnet und die Zeit in einer Edit- Kompo ausgegeben. Dabei kam ziemlich genau 1ms raus.

    Kann natürlich sein das, wenn mein Programm noch viele andere Sachen zu erledigen hat, die Sleep- Zeit größer wird. Das wird dann natürlich sehr ungünstig.

    Hast Du denn ein Beispiel parat, wie ich mir mit dem QueryPerformanceBla eine genauere Sleep- Funktion bauen kann??? Danke schon mal.

    In dem Link, den ich gepostet habe, ist ja ein Beispiel dazu. Aber das scheint für VC++ gemacht zu sein. Wenn ich das in meinen Borland Builder übernehme, werden ein Haufen Fehler produziert.

    Grüße
    Franky



  • Ich nochmal,

    @RPD
    Ich habe gerade nochmal das mit der Sleep-Funktion überprüft. Ergebnis:

    Sie funktioniert gut, wenn sie selten aufgerufen wird. Konkret: Ich starte die Sleep(1) mittels des MultimediaTimers jede Millisekunde. Dabei messe ich die eine Verzögerung durch Sleep(1) von 1ms.

    Dann habe ich mir eine Art Stoppuhr gebaut. Dabei wird mir Sleep(1) in einer while-Schleife gearbeitet. Ergebnis: Die Sleep- Zeit vergrößert sich in etwa um den Faktor 10! (genau: 8ms) :o
    Daher kommen also meine Zeitprobleme. Danke auf jeden Fall für den wichtigen Hinweis.

    @alle
    Meine konkrete Frage: Was muß ich beachten, bzw ändern, wenn ich das VC++ Programm aus dem o.g. Link im Borland Builder zum Laufen bekommen möchte. Danke.

    Grüße
    Franky

    [ Dieser Beitrag wurde am 06.02.2003 um 15:51 Uhr von Franky editiert. ]

    [ Dieser Beitrag wurde am 06.02.2003 um 15:56 Uhr von Franky editiert. ]



  • achtung: sleep() ist betriebssystemabhängig! unter win95/98 beträgt die auflösung zwischen 30 und 50ms! (auch wenn man 1 ms nimmt kanns auch mehr sein - hängt wohl wirklich mit der zur verfügugn stehenden rechenleitung zusammen), unter NT/2000 & Co gehts bis auf 10ms (die garantiert werden!)

    das dürfte genau das hier mehrmals beschriebene problem sein: 1 ms KANN schon stimmen, muss aber unter bestimmten umständen nicht!

    [edit] echtzeit ist unter win eben ein problem
    evtl. hilft auch die holzhammermehtode: kannst du auch per asm den timer-INT verbiegen auf ne eigene routine... 😕
    [/edit]

    [ Dieser Beitrag wurde am 06.02.2003 um 19:56 Uhr von flosko editiert. ]


Anmelden zum Antworten