Kürzere Pause als Sleep(1)???
-
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 bastelnIst 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
FrankyPS: 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.htmlVielleicht 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. ]