Forum
Tipps
News
Menu-Icon

Alternative zu Sleep in C(++) unter Windows ohne busy waiting

Hallo,

ich brauch etwas äquvalentes zur Sleep() Funktion in C oder C++ unter Windows, dass bei Angabe von einer Millisekunde auch wirklich nur eine Millisekunde schläft. Sleep(1) braucht im Schnitt um die 16 Millies, da Windows ja erstmal nach anderen Prozessen schaut. Ich habe auch schon eine Alternative Funktion mit dem QueryPerformanceCounter geschrieben, die aber leider busy wait betreibt und damit die Prozessorlast hochjagt.

Hat noch einer eine Idee?


Antworten zu Alternative zu Sleep in C(++) unter Windows ohne busy waiting:

Es gibt dabei mehrere Möglichkeiten :

1. Multimedia Timer (kenne ich mich nicht so gut mit aus)
 Diese sind leider auch etwas gefährlich ...

2. Waitable Timer
 h = ::CreateWaitableTimer( 0, bManualReset, 0 );
 ::SetWaitableTimer( m_h, (const LARGE_INTEGER*) &emit_time, 0, 0, 0, false );

und dann ein WaitForSingleObject/MultipleObjects auf dem Handle machen.

Dies ist eine sehr gute Art und Weise, da man auch auf andere events warten kann.

3. WM_TIMER (mit SetTimer( hwnd, millisekunden ) ...)
Nicht sehr genau und es können andere Events dazwischen kommen die dann mehr Zeit fressen.

Leider kann man nicht sehr genau warten (Es kann immer sein das ein anderer Prozess eher drankommt).
Deshalb sollte man auch gleichzeitig die Priorität erhöhen (wenn man kein Busy-Waiting macht).

hoffe das hilft dir.

Hm man könnte mal SetTimer probieren


Wenn Du kein Busy-Wait haben willst, also sprich Deine Prozessorzeit anderen Threads zur Verfügung stellen willst, dann wirst Du wohl auch mindestens eine "Slice" warten müssen - also die kleinste Zeiteinheit, die das System an Threads vergibt.

Wenn ich mich recht entsinne müsste das auch bei Windows 10ms sein, so dass ein Sleep(1) immer mindestens diese 10ms wartet. Aber ich glaube ausserdem, dass ein "Sleep(0)" nur dann den Prozess schlafen legt, wenn auch wirklich andere Prozesse da sind, die lauffähig wären.

Dann würde evtl. etwas wie das funktionieren:

while( wait_time < 1 ms )
{
  Sleep(0);
}

Nur eine Vermutung, aber Versuch macht klug ;-)
Wenn dann aber andere Prozesse warten, dann dauert auch diese Schleife wieder mindestens 10ms.


Übrigens macht das Unix-usleep ein Busy-Wait wenn eine Zeit kleiner der "Time-Slice" angegeben ist...

Das generelle Problem mit Sleep ist, dass es eh nur sehr ungenau funktioniert. Auch bei Sleeps mit Zeiten länger als ein "Slice" wird mal länger und auch mal kürzer als die angegebene Zeit gewartet. Das ist aber wohl eher ein Problem des Betriebssystems. Windows ist eben nicht echtzeitfähig und auch nicht dafür konzipiert.
Ich suche nach einer Möglichkeit, ein wenig mehr Echtzeitfähigkeit hineinzubekommen.


« DirectX-SDK und Visual C++!Text aus zwei Textfeldern in Textdatei Speichern »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
C++
C++ ist eine von der ISO standardisierte Programmiersprache und eine erweiterte Form von C zur objektorientierten, generischen und prozeduralen Programmierung. Weitestgeh...

Scart
SCART, ein europäischer Standard für Steckverbindungen, spielte eine wichtige Rolle in der Geschichte der Audio- und Videotechnik. Ursprünglich konzipiert,...

Apple Events
Unter Apple Events wird ein System zur einfachen Kommunikation zwischen verschiedenen Softwares verstanden. Macintosh-Programme, die Events unterstützen, können...