Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Portable sleep Funktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
24.07.2007, 21:57 Uhr
tobb



Hi,

Ich versuche mir gerade eine Funktion zu programmieren, die das Programm um die angegebenen Milliskeunden schlafen legt und die dazu noch portabel ist.

Ansatz:

Code:
    #ifdef WIN32
        #include "windows.h"
    #else
        #include "unistd.h"
    #endif
    //Wait the specific milli seconds (and check which system is used)
    inline void CrossSleep(const unsigned int MilliSeconds)
    {
        #ifdef WIN32
            Sleep(MilliSeconds);
        #else
            usleep(MilliSeconds * 1000);
        #endif
    }



Getestet mit folgendem Code

Code:
#include "SDL.h"
//...
int temp = SDL_GetTicks();
CrossSleep(1);
std::cout << SDL_GetTicks() - temp << " ms" << std::endl;


(mehrmals laufen lassen und dann Durchschnitt gebildet
Ausgabe unter Windows:
2 ms
Ausgabe unter Linux:
9 ms

Unter Windows ist das ganze ok, aber unter Linux eifnach inakzeptabel... was kann man da machen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.07.2007, 23:07 Uhr
0xdeadbeef
Gott
(Operator)


Auf genaue Zeiten kannst du dich mit Sleep, sleep und usleep nur unter sehr speziellen Umständen verlassen - dazu kommt, dass das Drumherum auch nochmal Zeit frisst, und der Kernel-Scheduler auch andere Prozesse zu berücksichtigen hat. Gerade bei sehr kleinen Intervallen kommt es da zu Ungenauigkeiten.

Du kannst mit sched_setscheduler und nanosleep eine brauchbare Annäherung implementieren, aber - wozu brauchst du das eigentlich? Wenn du da real-time-Applikationen bauen willst, ist das ein denkbar schlechtes Fundament.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.07.2007, 23:35 Uhr
tobb



Es geht nur darum um die CPU zu entlasten...

Mit der Funktion rest() aus der Allegro Bibliothek konnte man mit rest(1) damit rechnen, dass die Wartezeit unter 4-5 ms liegt...

Mit SDL_Dleay(1) aus der SDL oder Sleep(1) aus der WinAPI schläft er aber manchmal um die 15ms... das ist definitiv zu lange...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.07.2007, 23:44 Uhr
0xdeadbeef
Gott
(Operator)


Wie soll das denn die CPU entlasten? Ich hab grad Probleme, mir da nen Zusammenhang herzukonstruieren.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.07.2007, 00:00 Uhr
tobb




Code:
while(!(Bedigung die erst nach einer Weile eintritt))
{
}


Schlechter Code, da lange Zeit nichts passiert, nur gewartet wird, aber die CPU zu 100% augelastet ist...


Code:
while(!(Bedigung die erst nach einer Weile eintritt))
{
    usleep(1);
}


Schon besser... die CPU ist nur noch zu 3% augelastet....

Dafür und noch für andere fälle brauche ich es...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.07.2007, 09:49 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Ist trotzdem sehr schlecht. Wenn du auf bestimmte Ereignisse wartest gibt es da entsprechende Funktionen für.
Unter Windows wäre das zum Beispiel WaitForSingleObject unter anderen Systemen wird es garantiert ähnliches geben...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.07.2007, 14:20 Uhr
~tobb
Gast


Nein es ist nicht schlecht...

Natürlich läuft es so in etwa ab

Code:
while(!(Bedigung die erst nach einer Weile eintritt))
{
    //Do some standard stuff
    usleep(1); //relief the CPU
}


Ich warte also nicht stur sondern es läuft schon code in der Schleife ab, der dann abgebrochen wird, wenn die Bedingung erfüllt ist.
Nur muss diese sache nicht die CPU zu 100% belasten... daher das usleep...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.07.2007, 14:27 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Doch ist es
Das lastet das System zwar nicht mehr so stark aus wie ohne ein Sleep aber es ist trotzdem eine unnötige Belastung die durch ein vernünftiges Design vermieden werden könnte.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
25.07.2007, 14:51 Uhr
~tobb
Gast


Wie soll sowas aussehen... es muss zusätzlich noch portabel sein.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
25.07.2007, 15:08 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Das kommt auf den Fall drauf an. Du kannst nicht mal gerade so eine für alle Systeme portable Funktion aus dem Ärmel schütteln welche sich um solche sehr speziefischen Dinge kümmert. Sonst gäbe es sowas ja auch schon (wobei ich nicht weiß ob es sowas nicht sogar schon bei den verschiedenen plattformübergreifenden Bibliotheken gibt weil ich sie nicht nutze).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: