Restzeit anzeigen?



  • Hallo,

    hätte da eine kleine Frage - ich führe eine Funktion solange aus, bis ein Timer abgelaufen ist:

    Timer = ::CreateWaitableTimer( 0, true, 0 );
    endTime.QuadPart *= -10000;
    ::SetWaitableTimer( Timer, &endTime, 0, 0, 0, false );
    
    while(WaitForSingleObject( Timer, 0 ) != WAIT_OBJECT_0)
    {
    Start();
    }
    

    Nun möchte ich auch gern anzeigen, wieviel Zeit noch verbleibt. Wie stelle ich das an?

    Ich hab es so versucht:

    CString Text = "Restzeit: " + IntToCString((int)endTime.QuadPart) + " Sekunden";
    

    Aber endTime bleibt wohl immer konstant....

    Weiß jemand Rat?



  • Hi !
    Du könntest ja die aktuelle Zeit periodisch abfragen, die Differenz zu
    endTime bilden und anzeigen.



  • Und wie frage ich die aktuelle Zeit ab?



  • Najanun, da du ja mit der Winapi arbeiten möchtest, kannst du ja die GetSystemTime -Funktion benutzen.



  • Ah ok, da gibts bei google ne Menge Beispiele zu, vielen dank, das hilft mir weiter!



  • Wobei, der Codeausschnitt sieht auch etwas komisch aus. Deine while-schleife

    while(WaitForSingleObject( Timer, 0 ) != WAIT_OBJECT_0)
    

    erzeugt keinen Wait auf den Timer, sondern prüft nur dessen Zustand und kommt sofort zurück. (dwMilliseconds = 0). Das bedeuted das die Schleife quasi in Echtzeit das Timerobjekt solange polled bis es WAIT_OBJECT_0 zurückgibt. Da könntest Du Dir den Timer auch gleich sparen, bzw. der eigendliche Vorteil des Timers, den Thread im Suspend-Mode auf dessen Ablauf warten zu lassen geht komplett verloren...

    Wenn Du die bereits vergangene Zeit im Sekundentakt ausgeben willst könntest Du das viel geschickter machen an de Stelle. Setz den zweiten Parameter von WaitForSingleObject auf 1000ms. Dann warted die Funktion immer entweder genau eine Sekunde oder bis der Timer abgelaufen ist. Nach einer Sekuden kannst Du dann die aktuell verstrichene Zeit ausgeben (Halt im sekudentakt). also ca so:

    int zeit = 0;
    
    while(WaitForSingleObject( Timer, 1000 ) != WAIT_OBJECT_0)
    {
       // der Teil wird alle 1000ms ausgeführt solange der Timer noch nicht abgelaufen ist
       zeit++;
       CString Text = "Verstrichene Zeit: " + IntToCString(zeit);
    }
    


  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Also ich habs jetzt so gebaut:

    int StartZeit = clock(); 
    int RestZeit = 0;
    ...
    while(WaitForSingleObject( Timer, 0 ) != WAIT_OBJECT_0)
    		{		
    			Start();
    			// Restzeit = Countdown - vergangene Zeit. clock() liefert die aktuelle Zeit
    			RestZeit = (int)Countdown - (clock() - StartZeit)/CLOCKS_PER_SEC;
    			m_RestzeitText = "Restzeit: " + TimeFormat(RestZeit/3600 % 60) + ":" + TimeFormat(RestZeit/60 % 60) + ":" + TimeFormat(RestZeit % 60);	
    		}
    


  • Ähm.
    Hat es einen bestimmten Grund dass du einen "waitable timer" verwendest? Wenn dieser nicht irgendwo in Code vergraben ist den du nicht gepostet hast würde ich einfach GetTickCount() verwenden:

    void foo(DWORD milliSec)
    {
        DWORD now = ::GetTickCount();
        while(1)
        {
            DWORD diff = ::GetTickCount() - now;
            if (diff >= milliSec)
                break;
            else
               ZeigeRestzeit(milliSec - diff);
            Blubb();
        }
    }
    

Anmelden zum Antworten