Timer ohne Sleep()?



  • Einen schönen Abend an alle 🙂 ,
    Ich habe mir ein kleines Programm geschrieben welches zur Erinnerung für mich dienen soll.Es wartet bis eine vorher eingegebene Zeit vergangen ist und wenn diese Zeit abgelaufen ist gibt er mir solange ein Beep() aus bis ich stop in die Konsole eingebe.
    Nun zur Frage ich würde gerne eine Funktion einbauen um mir die Aktuell vergangene Zeit ausgeben lassen zu können.Das ganze funktioniert dann mit Sleep() auch nichtmehr soweit ich denke ,deshalb frage ich mich wie man das ganze anders gestalten könnte ,damit ich mir auch die aktuell vergangene Zeit anzeigen lassen kann.Hier mein bisheriger Code falls es jmd interessiert 🙂

    #include <iostream>
    #define WIN32_LEAN_AND_MEAN
    #include <Windows.h>
    #include <String>
    using std::cout;
    using std::cin;
    using std::string;
    
    DWORD WINAPI ThreadFunc( int &param )
    {
    
    	while (param == 0)
    	{
    	Beep(3000,3000);
    	Sleep(3000);
    	}
    	std::cout << "thread wurde gestoppt";
    	return 0;
    }
    
    int main ()
    {   unsigned long time = 0;
    	cout << "Wielange soll die Stoppuhr laufen?(in Minuten)\n";
        cin >> time;
    	time = time*60000;
    	cout << "Sie werden nun benachrichtigt sobald die Zeit abgelaufen ist\n";
    	Sleep(time);
    	cout << "Geben sie stop in die Konsole ein um das Programm zu beenden\n"; 
    
    	int iCondition = 0;
    	DWORD dwThreadID = 0;
    
    	HANDLE hThread = 0;
    	hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&ThreadFunc, &iCondition, 0, &dwThreadID);
    
    	if (!hThread || !dwThreadID)
    		return 1;  
    
    	string abbruch;
    	cin >> abbruch;
    
    	if (abbruch == "stop")
    	{   iCondition = 1;
    	    WaitForSingleObject(hThread, INFINITE);
    	    CloseHandle(hThread);
    		cout << "Programm schließt in 3 Sekunden\n";
    		Sleep(3000);
    	}
    
    	else 
    	{
    		cout << "Falsche Eingabe bitte stop eingeben \n";
    	}
    
    	return 0;
    }
    


  • Und wo genau ist das Problem?



  • hustbaer schrieb:

    Und wo genau ist das Problem?

    Sagen wir mal ich stelle 10 Minuten als Zeit ein.Nach 5 minuten würde ich mir aber gerne die Zeit anzeigen lassen welche bereits vergangen ist.Wie soll ich das mit nem Sleep() machen können?Ich übergebe dem Sleep ja nur die Zeit die er warten soll ,und habe keine Variable welche die aktuelle Zeit mitzählt.Und da wäre halt die Frage wie man sowas gestalten könnte.Ich hoffe du verstehst was ich meine ist bisschen schwer zu erklären :).



  • Schlaf immer nur 900 Millisekunden und zeig dann die Zeit an. Das in einer großen Schleife. Kein zweiter Thread.
    Oder SleepEx oder doch nen Timer und ein Event und WaitForMultipleObjects.



  • hustbaer schrieb:

    Und wo genau ist das Problem?

    Er will die aktuell vergangene Zeit.
    Edit: Sorry, zu spät. Shame on me.



  • volkard schrieb:

    Schlaf immer nur 900 Millisekunden und zeig dann die Zeit an. Das in einer großen Schleife. Kein zweiter Thread.

    Ah stimmt so kann ich das natürlich auch handhaben danke dir.



  • DerNoob1993 schrieb:

    volkard schrieb:

    Schlaf immer nur 900 Millisekunden und zeig dann die Zeit an. Das in einer großen Schleife. Kein zweiter Thread.

    Ah stimmt so kann ich das natürlich auch handhaben danke dir.

    In der Dchleife aber immer die Uhrzeit abfragen. Die ist genauer als Sleep, insbesondere, wenn man für 15 Minuten 1200 mal Sleep aufruft und jedes davon mit Pech 50ms abweicht.
    Selbst Sleep(1) reicht übrigens normalerweise, um die Prozessorlast von 100% auf 0% bis 1% zu senken.
    Aber die Schleife verschmitzt den Cache, das ist nicht optimal. Deswegen ist eigentlich schon das Zeug mit Thread und Wait... besser. Eigentlich.


Log in to reply