Stoppuhr in C



  • clock(), <time.h>



  • Razer6 schrieb:

    Diese Minute ist aber nicht akzeptabel, da das ganz zuverlässig ablaufen soll.

    Wie kann ich das am Besten schreiben, das das genau abläuft.

    Mach halt Sleep(983);

    *scnr* 😃



  • Mach den sleep sagen wir mal für 1 min, überprüfe mit time bzw. difftime wieviel zeit vergangen ist, wenn der timer beinah abgelaufen sit erhöst du die "frequenz" von und machst nurnoch einen sleep von 1 sec dann wieder difftime, so kannst du es denk ich mal ziemlich genau timen.
    Vll. gibts aber auch ne bibliothk die das besser erledigt



  • Wär es nicht einfacher beim Start mit time() die Zeit zu nehmen, und in einer while Schleife auf das Stopp warten, die neue Zeit nehmen und die Differenz auszuspucken?



  • Ne while schleife lasstet den cpu da zu sehr aus!
    Das könnte man machen wenns um einige sekunden ginge,
    aber eine stunde den cpu zu 100% auszulasten ist verschwendung



  • Hallo an alle

    Ich hab jetzt etwas mit clock(); gschrieben. Dazwischen hab ich ein Sleep(1000); Jetzt bekomm ich bei der Anzeige der Zeit, die inzwischen vergangen ist, immer 1000µs.

    Hier der Code:

    #include <stdio.h>
    #include <conio.h>
    #include <windows.h>
    #include <time.h>
    
    int main (void)
    {
    	int stunden,minuten,sekunden;
    	char auswahl;
    	float time;
    
    	clock_t start, ende;
    
    	do
    	{
    		system("cls");
    
    		printf("\n                  | STOPPUHR |\n\n"
    			   "Stoppuhr starten (s)\n"
    			   "Programm beenden (x)\n"
    			   "----------------------\n"
    			   "Ihre Wahl: ");
    
    		auswahl=getch();
    
    		switch(auswahl)
    		{
    		case 's':
    			system("cls");
    			sekunden=0;
    			minuten=0;
    			stunden=0;
    
    			for(;;)
    			{
    				start = clock();
    
    				sekunden++;
    
    				if(sekunden==60)
    				{	
    					minuten++;
    					sekunden=0;
    				}
    
    				if(minuten==60)
    				{	
    					stunden++;
    					minuten=0;
    				}
    
    				Sleep(505);
    
    				if(_kbhit())
    					break;
    
    				ende = clock();
    				time = (float)(ende - start) / CLOCKS_PER_SEC * 1000;
    				system("cls");
    
    				printf("    %d h: %d min : %d sek %f ",stunden,minuten,sekunden, time);	
    			}
    			break;
    
    		case 'X':
    		case 'x':
    			system("cls");
    			printf("\nProgramm wird beendet...\n");
    			getch();
    			break;
    		default: printf("Falsche Eingabe");
    				getch();
    				break;
    		}
    	}
    
    	while(!(auswahl == 'x' || auswahl == 'X'));
    return 0;
    }
    

    Obwohl ich Code dazwischen habe, hab ich laut dem Programm keine Abweichung. Die hab ich aber. ~1min / Stunde.

    Kann mir da bitte wer helfen?

    Danke im Voraus

    Gruß Robert



  • aber klar doch, wenn du "start" immer wieder neu setzt, muessen sich die ganzen fehler doch aufaddieren.

    edit: Sleep(505) soll fuer dich eine sekunde darstellen? erklaere das.



  • Shi*t, die 505 sind noch drinnen im Code:( Ich hab auch getestet, wie es sich mit halben Sekunden verhält. Da kommt man nie genau auf eine halbe Skunde 😢

    @c.rackwitz: Ich versteh nicht genai deine Frage. Ich will ja wissen wie lange der Code dazwischen dauert. Damit ich die Sleep() Funktion an genau eine Sekunde anpassen kann.

    Kann Sleep() überhaubt mit float oder double Werten umgehen??

    Wie kann ich das am Beseten realisieren?

    Danke im Voraus

    Gruß Robert



  • Du solltest besser einmal vor der Schleife die Startzeit feststellen und dann am Ende jedes Schleifendurchlaufs die Differenz zu diesem Wert berechnen, das dürfte exaktere Werte ergeben.



  • Razer6 schrieb:

    Ich will ja wissen wie lange der Code dazwischen dauert. Damit ich die Sleep() Funktion an genau eine Sekunde anpassen kann.

    Was ist das denn für ein Quatsch? Du denkst da irgendwie falsch. Der Code wird niemals immer in der gleichen Zeit ablaufen.
    Du hast schließlich nen Scheduler und jede Menge anderer Prozesse auf deinem System laufen. Deswegen kannst du eben nicht davon ausgehen, dass dein Prog immer exakt mit den gleichen Zeitscheiben ausgeführt wird.

    Für eine exakte Messung (falls es auf nem Nicht-Echtzeit-System überhaupt möglich ist exakt Zeit zu messen) kannst du nur die Methode benutzen, die CStoll beschrieben hat.



  • DarthZiu schrieb:

    Du hast schließlich nen Scheduler und jede Menge anderer Prozesse auf deinem System laufen. Deswegen kannst du eben nicht davon ausgehen, dass dein Prog immer exakt mit den gleichen Zeitscheiben ausgeführt wird.

    da hilft eben nur ein hardwaretimer, der ist immer genau, es sei denn dein prozessor hat einen kaputten taktgenerator. guckt ihr: http://www.intel.com/cd/ids/developer/asmo-na/eng/downloads/209859.htm?page=3



  • CStoll schrieb:

    Du solltest besser einmal vor der Schleife die Startzeit feststellen und dann am Ende jedes Schleifendurchlaufs die Differenz zu diesem Wert berechnen, das dürfte exaktere Werte ergeben.

    So ganz verstehe ich das nicht.

    start = clock();
    do
    {
    ende = clock();
    }
    while(((ende - start) / CLOCKS_PER_SEC) < 1);
    

    So hab ich eine Sekunde, oder?? Jedoch was hilft mir das??

    Ich muss das ganze portabel machen. Also nicht an meinem PC das ganze anpassen. Es muss auch auf andern Computern laufen.

    Ich komm eher aus der Mikrocontrollerprogrammiererei. Bei den µCs gibt es Timer, in verschiedenen Frequenzen laufen können. Das sind Zähler, die bei einem gewissen Wert zB 255 (8 Bit) innen Interrupt haben (Timer Overflow) und vom Hauptprogramm direkt in eine Interruptroutine springen. Dort kann zB ein Zähler inkrementiert werden. Danach, wenn die Interruptroutine zu Ende ist, springt das Programm wieder in die Main.

    Gibt es so etwas auch am PC beim Programmieren???

    An den TSC traue ich mich derzeit noch nicht zu ran. Denn da ist Assembler notwendig 😞

    Wie könnte ich das sonst elegant lösen??

    Danke im Voraus

    Gruß Robert



  • Eher so:

    start = clock();
    
    while(!ABBRUCHBEDINGUNG_FÜR_DIE_STOPPUHR_ZUM_BEISPIEL_TASTENDRUCK)
    {
    }
    
    ende = clock();
    
    meine_gestoppte_zeit = ende - start;
    


  • Hi

    Ich muss aber die aktuelle Stoppuhrzeit auf der Konsole ausgeben.

    Gruß Robert



  • Dann hänge doch ein

    cout << meine_gestoppte_zeit << endl;
    

    an? 😉



  • Hallo

    Solang man nicht Stop drückt, gibt es aber noch keine Zeit.



  • DarthZiu schrieb:

    start = clock();
    
    while(!ABBRUCHBEDINGUNG_FÜR_DIE_STOPPUHR_ZUM_BEISPIEL_TASTENDRUCK)
    {
        cout << clock() - start << endl;
    }
    
    ende = clock();
    
    meine_gestoppte_zeit = ende - start;
    

    Beschreib uns doch mal genau, was dein Prog machen soll. Und auch, was du damit bezweckst. Vielleicht gibts ja bessere Ansätze.



  • Durch die Befehle, die zwischen start = clock() und ende = clock() liegen, geht doch auch Zeit verloren. Das ist die Zeit die Dir dort fehlt... Wie wärs mit sowas (angelehnt an DarthZiu):

    start = jetzt();
    
    while(!ABBRUCHBEDINGUNG_FÜR_DIE_STOPPUHR_ZUM_BEISPIEL_TASTENDRUCK)
    {
      ende = jetzt();
      verstrichen = ende - start;
      /* Ausgabe aufbereiten */
      Sleep(100 - (jetzt() - ende)); /* Die beim Berechnen und Ausgeben verstrichene Zeit von einer Sekunde abziehen */
    }
    ende = jetzt() - start;
    

    Viel genauer wirst Du es nicht hinbekommen.
    (Habe für die Übersicht clock() durch jetzt() ersetzt, welches Millisekunden statt Clockticks liefert)

    EDIT: Die Berechnung bei dem Sleep dient nur dazu damit die Zwischenschritte auch wirklich jede Sekunde kommen, der Genauigkeit der Gesamtzeitnahme tut das keinen Abbruch.

    EDIT2: Und sorry wegen cout, hier im ANSI C Forum natürlich printf 😉



  • LordJaxom schrieb:

    Durch die Befehle, die zwischen start = clock() und ende = clock() liegen, geht doch auch Zeit verloren.

    Das is aber egal. IMHO soll der Befehl 'clock()' (is ja Pseudocode) ja irgend einen internen Zähler ausgeben. Was zwischen den Abfragen von 'clock()' geschieht ist da ja egal.

    edit: Ups, clock() is doch kein Pseudocode. Is aber egal, dass ändert nichts an der Tatsache, dass du zwei fixe Werte hast, die nicht vom Programmablauf beeinflusst werden.



  • Hallo an alle

    Das Programm soll bei beim Tastentruck von s eine Stopuhr starten. Am Konsolenfenster soll die verstrichene Zeit angezeigt werden. in HH : MM : SS. Beim Tastendruck irgendeiner Taste soll der Zähler stoppen und die verstrichene Zeit angezeigt werden. Beim nächsten Tastendruck wieder eine Rückkehr zum Menü. Und das möglichst genau.


Anmelden zum Antworten