Sleep(); - Alternative



  • Wollt mal wissen, ob- und was es da gibt,
    da bei Sleep(); ja alles eingefroren wird.
    Vieleicht mit <time.h>???

    Danke!
    Canon



  • Was soll das heissen, "alles eingefroren"? Es wird ja nur in dem Thread, in dem Sleep aufgerufen wurde, gewartet. Alles andere läuft weiter. Sleep ist übrigens keine Standardfunktion. Was willst du denn genau machen?



  • Ich will eine bewegung simulieren, indem ein bild nach einer bestimmten
    zeit ein stück verschoben wird. Um diese zeit zu simulieren viel mir nur
    Sleep(x); ein. Allerdings sollen die anderen prozesse, z.B. das bewegen
    einer Figur immernoch ausgeführt werden können. Bei Sleep wird allerdings alles
    angehalten. Ich dachte mir jezt, das man dafür auf die systemuhr zurückgreifen
    könnte, und z.B. x seunden nach starten des programmes das Bild um 1 verschoben
    wird, in der nächten wieder, usw. ich weiß allerdings nicht wie ich das anstellen könnte. 😕



  • Das Schlüsselwort für dich heisst Timer. Such mal hier oder im Grafikforum, da gabs schon 'ne ganze Menge Beiträge dazu.



  • Ich hab jezt schon sau lange gesucht, aber nix gefunden, was ich gebrauchen
    konnte. Hast du schonmal sowas gemacht, und weißt du wie das geht???

    Danke für deine Hilfe!





  • net schrieb:

    du hast eine single-threaded windoof-anwendung?

    Nee, hat er mit Sicherheit nicht. Da er von Sleep() redete, vermute ich, er hat 'ne Windows Anwendung.

    Canon schrieb:

    Ich hab jezt schon sau lange gesucht, aber nix gefunden, was ich gebrauchen konnte.

    Glaub ich nicht. 😉

    http://www.c-plusplus.net/forum/viewtopic.php?t=82977&postdays=0&postorder=asc&highlight=timer&start=40 hier findest du zB eine Timer Klasse
    wenn du dich als fortgeschritten siehst, kannst du dir auch mal boost::timer angucken
    oder du schreibst dir eigene Timer Funktionen/Klasse (für hochauflösende Sachen schau dir mal die Performance Counter an ➡ QueryPerformanceCounter)

    Der grundlegende Ablauf kann dann ungefähr so aussehen:
    1. Starte Timer mit gewünschter Dauer
    2. Timer abgelaufen? ja ➡ 3., nein ➡ 4.
    3. bewege Bild ➡ 1.
    4. verarbeite Timer unabhängige Daten ➡ 2.



  • groovemaster schrieb:

    net schrieb:

    du hast eine single-threaded windoof-anwendung?

    Nee, hat er mit Sicherheit nicht. Da er von Sleep() redete, vermute ich, er hat 'ne Windows Anwendung.

    Richtig 👍

    Groovemaster schrieb:

    Canon schrieb:

    Ich hab jezt schon sau lange gesucht, aber nix gefunden, was ich gebrauchen konnte.

    Glaub ich nicht.

    is aber so 🙄

    groovemaster schrieb:

    wenn du dich als fortgeschritten siehst, kannst du dir auch mal boost::timer angucken.

    Ne, tue ich nicht.

    groovemaster schrieb:

    oder du schreibst dir eigene Timer Funktionen/Klasse (für hochauflösende Sachen schau dir mal die Performance Counter an ➡ QueryPerformanceCounter)

    was meinst du, was ich schon die ganze zeit versuche?

    groovemaster schrieb:

    Der grundlegende Ablauf kann dann ungefähr so aussehen:
    1. Starte Timer mit gewünschter Dauer

    Würd ich gerne, aber ich weiß nicht wie 😞

    groovemaster schrieb:

    2. Timer abgelaufen? ja ➡ 3., nein ➡ 4.
    3. bewege Bild ➡ 1.
    4. verarbeite Timer unabhängige Daten ➡ 2.

    dazu müste man erstmal ➡ 1 kennen

    ich muss nur wissen, wie man eine simple Stoppuhr startet bzw. stopt.
    Dieser:http://www.c-plusplus.net/forum/viewtopic.php?t=82977&postdays=0&postorder=asc&highlight=timer&start=40
    Link hat mir auch leider leider 😞 auch nix gebraucht, weil dort solche
    einfachen sachen schon als bekannt verausgesezt werden.
    Könntest du nicht einfach bitte mal posten wie das geht???

    *Danke*!



  • hier mal ein ganz simpler timer als pseudocode um einfach mal ein beispiel zu geben wie sowas funktioniert:

    class timer{
        private:
            unsigned int i;
        public:
        void start(){
          i=gettime();
        }
        bool timeElapsed(int seconds){
             return gettime()>=i+seconds;
        }
    }
    //in der main
    timer time;
    time.start();
    while(true){
        if(time.timeElapsed(1){
             movePicture();
             time.start();//damit das bild nach dem ersten bewegen nicht in jedem weiteren Frame bewegt wird
        }
        //ganz normal weiterarbeiten
    }
    

    schlagt mich nicht wegen der klasse, hatte keine lust creativ zu sein^^



  • otze schrieb:

    schlagt mich nicht wegen der klasse, hatte keine lust creativ zu sein^^

    Nicht wegen der Klasse, sondern wegen der Anwendung. Sonst nimmt sich ja jemand ein Beispiel daran und implementiert ein solches Polling.



  • @Canon
    Ob du eine Stoppuhr oder einen Timer benutzt, ist letztendlich egal. Ich poste einfach mal meine Stoppuhr, vielleicht hilft die dir ja mehr.

    // .cpp
    class chronometer
    {
    public:
    	typedef long long duration_type;
    private:
    	static const duration_type frequency_;
    	static duration_type query_frequency()
    	{
    		LARGE_INTEGER f;
    		QueryPerformanceFrequency(&f);
    		return f.QuadPart;
    	}
    	static duration_type frequency()
    	{
    		return frequency_;
    	}
    public:
    	static duration_type time_stamp()
    	{
    		LARGE_INTEGER c;
    		QueryPerformanceCounter(&c);
    		return c.QuadPart;
    	}
    private:
    	duration_type start_;
    	duration_type end_;
    	bool active_;
    public:
    	void reset()
    	{
    		if (!active_)
    			start_ = end_;
    		else
    			start_ = time_stamp();
    	}
    	void start()
    	{
    		if (!active_)
    		{
    			start_ += time_stamp() - end_;
    			active_ = true;
    		}
    	}
    	void stop()
    	{
    		if (active_)
    		{
    			end_ = time_stamp();
    			active_ = false;
    		}
    	}
    	duration_type elapsed_milliseconds() const
    	{
    		duration_type tmp;
    		if (!active_)
    			tmp = end_ - start_;
    		else
    			tmp = time_stamp() - start_;
    		return tmp * 1000 / frequency();
    	}
    	chronometer()
    		: start_(0)
    		, end_(0)
    		, active_(false)
    	{
    	}
    	~chronometer()
    	{
    	}
    };
    
    // .h
    const chronometer::duration_type chronometer::frequency_ = chronometer::query_frequency();
    

    Die Klasse ist eigentlich etwas komplexer, ich hab sie nur auf's wesentliche gekürzt. Solltest du also Fehler entdecken, ruhig nachfragen. Wenn du die Zeit für zB Sekunden brauchst, solte es auch kein Problem sein, eine entsprechende Funktion einzubauen.
    Aufgerufen wird das ganze dann wie folgt:

    chronometer cm;
    cm.start(); // Stoppuhr wurde gestartet
    //...
    cm.elapsed_milliseconds(); // bisher abgelaufene Millisekunden abfragen (Stoppuhr laeuft weiter)
    //...
    cm.stop(); // Stoppuhr wurde angehalten
    //...
    cm.elapsed_milliseconds(); // bis zum Stop abgelaufene Millisekunden abfragen
    //...
    cm.reset(); // Stoppuhr wurde auf 0 zurückgesetzt
    

    Man sollte noch erwähnen, dass die QueryPerformance...-Funktionen einen Rückgabewert liefern, der angibt, ob das System überhaupt über solche Counter verfügt. Willst du also für das Fehlen solcher Counter gewappnet sein, dann würde ich empfehlen eine Funktion zu schreiben, die das abfragt und einmalig zu Beginn des Programms aufgerufen wird. Afaik sollte diesbezüglich bei modernen Rechnen aber keine Probleme auftreten. Höchstens bei sehr alten Rechnern (486er & co) ist damit zu rechnen.


Anmelden zum Antworten