[C++]Sleep kleiner als ms?

ich hätte eine etwas unelegante lösung.
bau in die schleife einfach irgentwelche datenmüll ein.
des müsste die schleife auch ausbremsen,
so wie :
x = 3 * 3,14674739479497397379239 ( ok pi sieht anderst aus aber egal......)
musst halt merhere so sachen machen möglichst mit den gleichen variabelen , damit es nicht so viel speicherplatzt kostet.
 
Linux hat bei Zeiträumen kleiner 2ms das gleiche Problem wie das Sleep unter Windows. Die Zeitdauer um einen Task aus dem suspended mode aufzuwecken kostet bei so kleinen Zeiträumen zuviel Zeit. Deswegen benutzt nanosleep bei Zeiten <= 2ms eine busyloop anstatt den task zu suspenden. (Zumindest unter Linux)

Das kann man unter Windows (in der Regel) auch machen mit Hilfe des Performance-Timers (Wobei es von der Hardware des Recheners abhängt ob ein solcher Timer zur Verfügung steht. Aktuelle Prozessoren haben das aber soweit ich weis)

Code:
	LARGE_INTEGER start;
	LARGE_INTEGER stop;
	LARGE_INTEGER freq;
	
	if( QueryPerformanceFrequency(&freq) { // freq ist die anzahl der tics pro Sekunde
	      LARGE_INTEGER ms;
	      ms.QuadPart = freq.QuadPart / 2000;  // delay für eine halbe ms 

	      QueryPerformanceCounter(&start);
	      QueryPerformanceCounter(&stop);

	      // Die Schleife läuft solange bis der gewünschte Delay verstrichen ist
                      // Im gegebenen Beispiel eine halbe ms.
  	      while(start.QuadPart + ms.QuadPart > stop.QuadPart ) {
		QueryPerformanceCounter(&stop);
                      }
                }
                else {
                      // Kein Counter vorhanden
                }
 
Das Beispiel mit QueryPerformanceCounter sieht sehr gut aus! Allerdings muß man bei sowas immer im Hinterkopf haben, das die Schleife mindestens die eingestellte Zeit läuft, also auch etwas länger laufen kann. Harte Echtzeitanforderungen kannst du damit nicht erfüllen. Ebenfalls ist es möglich, daß der Task bzw. der Prozeß, in welchem die Schleife läuft, zwischendurch angehalten wird. Wenn er dann erst nach längerer Zeit wieder aktiviert wird, ist Dein Timer wahrscheinlich übergelaufen.
 
Zuletzt bearbeitet:
Stimmt usleep wurde ja ersetzt.

Eine weitere Möglichkeit die es gäbe, auch ohne den Prozess anzuhalten, währe den Pentium Zyklus Zähler zu nutzen und in einer Schleife abzufragen. Es ist zwar ein wenig Assambler dafür nötig aber es sollte gehn so sehr kleine Zeiten zu bekommen. Wenn man dann noch die Ausführungsdauer der umgebenen Schleife mit ein berechnet ginge es sogar relativ genau. Man müßte nur verhindern das der Prozess vom Scheduler unterbrochen wird. Auch hier kann ich leider nur aus Erfahrungen mit QNX zurückgreifen, dprt währe es möglich den Prozess als Fifo zu deklariehren und somit einen Rauswurf zu verhindern. So weit ich weiß ist dies unter Win jedoch nicht mögich da kein Echtzeitfähiges Scheduling existiert.

Ein weiterer Nachteil ist natürlich das man die Frequenz des Prozessors kennen muß, diese könnte man sich mehr oder weniger genau mit einem referenz Timer besorgen.

Das Auslesen müßte ich mal wieder raussuchen.
Gruß Lemiras
 
Du könntest versuchen, mit SetThreadPriority die Threadpriorität auf THREAD_PRIORITY_TIME_CRITICAL zu setzen. Damit habe ich aber noch keine Erfahrung, also ohne Gewähr!
 

Neue Beiträge

Zurück