Counter Verbesserung...



  • Hier erstmal meine Counter Funktion:

    void counter(int Sekunden, string task)
    {		
    		for(int i = Sekunden; i!=(-1); i--)  
    		{		
    
    			if(_kbhit())
    			{
    				char zeichen = getch();
    				if(zeichen == 'q')
    				break;
    			}
    
    			if(i != Sekunden)  
    			Sleep(1000);   
    
    			if(i==0)          
    			 break;
    
    			if(i==1)
    			cout << i << " Sekunde....\n"; 
    
    			else
    			{
    				if(i >= 120)
    				{		
    					cout << i << " Sekunden ";
    					cout << "(" << i/60 << "Minuten)..."<<endl;
    				}  
    
    				else
    				{				
    					cout << i << " Sekunden...\n";
    				}
    			}
    		}
    
    		exec(task);
    
    		cout << endl << endl;
    }
    

    Sobald der counter läuft kann man diesen mit der taste q beenden aber er führt trotzdem exec() aus wie kann man das verhindern??



  • char zeichen = getch();
    if(zeichen == 'q')
    {
        cout << endl << endl;
        return;
    }
    


  • Ist das zweite endl wirklich noch sinnvoll?



  • Michael E. schrieb:

    Ist das zweite endl wirklich noch sinnvoll?

    ...

    cout<<"\n"<<endl;
    

    ... wäre glaub ich sinnvoller^^



  • Danke für die Hilfe 🙂 habs so gemacht:

    int counter(int Sekunden, string task)
    {
    
    		for(int i = Sekunden; i!=(-1); i--)  
    		{				
    			if(_kbhit())
    			{
    				char zeichen = getch();
    				if(zeichen == 'q')
    				return 0;
    			}
    
    			if(i != Sekunden)  
    			Sleep(1000);   
    
    			if(i==0)          
    			 break;
    
    			if(i==1)
    			cout << i << " Sekunde....\n"; 
    
    			else
    			{
    				if(i >= 120)
    				{	
    					cout << i << " Sekunden ";
    					cout << "(" << i/60 << " Minuten)..."<<endl;
    				}  
    
    				else
    				{				
    					cout << i << " Sekunden...\n";
    				}
    			}
    		}
    
    		exec(task);
    
    		cout << endl << endl;
    
    		return 0;
    }
    

    Die Ausgabe sieht so aus:

    12 Sekunden..
    11 Sekunden...
    10 Sekunde...
    ...

    Wie kann man die ausgabe so erstellen, dass diese nur in einer zeile erfolgt.
    ein beispiel:

    Sekunden: 12

    Also "Sekunden:" bleibt in der zeile so stehn nur der Wert soll sich ändern.
    habs mit printf("\r..") habs nicht hinbekommen 😞



  • Ersetz mal das endl; bzw. "\n" in deiner Sekundenausgabe durch "\r", dann sollte er nicht mehr in die nächste Zeile springen. (vergiss nicht, ein Leerzeichen nachzuschieben, sonst bleibt die letzte Ziffer der Anzeige stehen, wenn du unter 100 bzw. 10 rutschst)



  • CStoll, du bist (das meine ich ernst) mein Held. 😃
    Genau danach habe ich gerade gesucht. Und \r hatte ich nirgendwo gefunden. Ich wusste, es gibt einen Befehl nur für "Carriage Return", aber in den Escape-Code-Listen, die ich habe, stehts nicht drin 😉

    Das ist fast so geil wie die Tatsache, daß ich bei sscanf mit einem * (z.B. %*s oder %*d" einen Wert überspringe und keine Variable angeben muss 🙂



  • Vielen vielen Dank!! 👍 🙂



  • Noch ne kleine Frage, wie kann ich mit der ESC Taste die Aktion abbrechen?



  • Ich bin mir nicht sicher, ob das von den Standard-Methoden überhaupt abgefangen wird, aber im Ernstfall könntest du getch() verwenden und auf (afaik) 27 überprüfen.



  • danke es funktioniert 🙂

    Sobald ich für i ein Wert über 60 oder 3600 soll der counter die zeit in h:min:sec ausgeben, doch bei mir ist das problem mit den sekunden die ich von den minuten/stunden abziehen muss hier ein beispiel:

    if(i >= 3600)
    				{
    					cout << "[" << cmd << "] wird in [" << i/3600 << ":" << i/60 << ":" << (60-i)*-1 << "] h:min:sec ausgef"<<ue<<"hrt... \r";
    				}
    
    				else if(i >= 60)
    				{	
    					cout << "[" << cmd << "] wird in [" << i/60 << ":" << (60-i)*-1 << "] min:sec ausgef"<<ue<<"hrt... \r";
    				}
    

    Also sobald ich z.b. für 65 eingebe kommt da das richtige wert raus [1:15] aber wenn ich 130 eingebe sollte das [2:10] sein, aber bei mir wird [2:70] angezeigt, also wie rechnet man das??



  • Mit dem Modulo-Operator kommst du an die Sekunden ran:

    cout << (i % 60) << " Sekunden";
    


  • DAnke habs so gelöst:

    cout << i/3600 << ":" << (i/60 % 60) << ":" << (i % 60);


Anmelden zum Antworten