Alternative zur Sleep-Funktion ?!

hi,
ich brauche eine moeglichkeit, den prozessor eine winzige wenigkeit zum warten zu zwingen (millisekunden bereich). zZ benutze ich Sleep(). allerdings ist der unterschied sleep oder nicht sleep riesig! das ist schon mal gut. nur denke ich das selbst Sleep(1), also 1 ms, mehr als eine millisekunde ist. oder besser, GANZ SICHER!
ich suche also nach einer praeziseren methode. kann mir da jemand weiterhelfen? danke!
nur kurz: die Sleep-funktion wird in einem thread ausgefuehrt, d.h. der thread soll tatsache 2, 3 oder 4 millisekunden innehalten.

cheers
hilmar

ps: achso, ich bastele heute in der nacht etwas daran, weil ich es morgen brauche. wenn ich also direkt an [email protected] antworten koenntet waere das super nett!

nur kurz: die Sleep-funktion wird in einem thread ausgefuehrt,
d.h. der thread soll tatsache 2, 3 oder 4 millisekunden
innehalten.

Das wird wohl nichts, zumindest unter den gängigen nicht echtzeitfähigen Betriebssystemen. Die Zeitscheiben bei diesen Systemen sind im Bereich von 10ms angesiedelt, und das ist auch der kleinste Zeitraum, den man abwarten kann. Außerdem geben alle sleep-Funktionen nur eine minimale Wartezeit vor.

Hallo!

Wegen dem Scheduling des BS ist es nicht möglich so kurz die CPU abzugeben.
Wenn du ganz kurz warten möchtest musst du Rechenleistung verbraten, was dem Multitasking nicht zugute kommt.

FĂĽr eine Schrittmotorsteuerung habe ich das mal so gemacht:

LARGE_INTEGER lStart, lEnd, lFreq;
QueryPerformanceFrequency(&lFreq);
int ms=0,delay=3;
QueryPerformanceCounter(&lStart);
while(ms

Hallo Hilmar,

es ist richtig, dass wegen dem OS-Scheduler und der ĂĽblichen 10ms-Zeitscheibe sleep nur in 10ms Schritten funktioniert.

Busy-Waiting ist aber auch nicht gerade schön…

Du kannst mal die Posix Funktion select() probieren:
http://www.fifi.org/cgi-bin/man2html/usr/share/man/m…

"
NOTES
Some code calls select with all three sets empty, n zero, and a non-null timeout as a fairly portable way to sleep with subsecond precision.
"

Funktioniert m. E. nach recht genau ohne CPU-Leistung zu verbraten. Habe allerdings nur Erfahrungen unter Linux damit, sollte aber unter Windows auch gehen, da es eigentlich eine Posix-Funktion ist.

GruĂź
Martin

Du kannst mal die Posix Funktion select() probieren:
http://www.fifi.org/cgi-bin/man2html/usr/share/man/m…

Das hat die selben Beschränkungen wie alle anderen Wartefunktionen auch, sprich: es ist von der minimalen Zeitscheibe abhängig.

Nicht wirklich, weil es keinen OS-sleep durchführt der am Scheduler hängt(habe mir allerdings noch nicht die Mühe gemacht und nachgeschaut was es statt dessen macht). Allerdings muss man den Prozess dafür auch auf realtime-priority setzen, das hätte ich noch erwähnen sollen.

Bei meinem konkreten Fall musste ich für eine 3D-Applikation auf 16-17ms (~60Hz) timen, sleep() brachte da eben 20ms, mit select() läuft’s ohne Probleme.

Deshalb: Select löst höher als die Zeitscheibe des Schedulers auf, sollte jedoch der Prozess gerade bei select() aus der CPU verdrängt werden, bricht man wieder auf das 10ms Raster runter.

Oder aber man übersetzt den Kernel mit 1ms Zeitscheibe, durch den dadurch entstehenden größeren Systemoverhead (es sind immerhin bis zu 10x mehr Prozesswechsel möglich) sollte aber die Leistung arg in die Knie gehen…

GruĂź
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

Wenn während des wartens nicht auf einen anderen Prozess umgeschaltet wird, dann geht die warte/CPU Zeit verloren, egal ob das System eine hohe CPU belastung anzeigt oder nicht.

Oder hab ich einen Denkfehler?

GruĂź Pauli!