Timer
-
Hi Community,
ich hab ein kleines Problem bei der Erstellung eines Timers.
Ich möchte einen Timer realisieren, der nach 50 Sekunden das Programm automatisch beendet und die verbleibende Zeit ausgibt.Falls allerdings eine Tastatur Eingabe kommt soll mit einer anderen Verarbeitung begonnen werden und nach dessen Beendigung wieder zum Timer zurück gesprungen werden.
Ich poste mal meinen bsp. Quellcode:
#include <stdio.h> #include <conio.h> #include <time.h> #include <stdlib.h> void initilizeTimer() { static int tRest = 50,dt = 1; time_t tj=0, tTick=0, tBell=0, cps=1; time(&tj); tBell = tj + tRest*cps; tTick = tj ; do { time(&tj); while (tj >= tTick) { system("cls"); printf("%70s%5d\r"," ",tRest); tRest -= dt; tTick += dt*cps; } } while(tj < tBell && !kbhit()); if(tj >= tBell) exit(0); } char Getit() { char ch = ' '; initilizeTimer(); ch = _getch(); return ch; } void main() { char c = ' '; while(1) { c = Getit(); if(c == 27) exit(0); } }
So mein Problem besteht jetzt darin, das wenn ich eine Taste drücke, der Timer immer um 1 dekrementiere wird und nicht die sekunden abgewartet werden.
Wenn ich also 50x ne Tastedrücke ist der Timer abgelaufen, egal welche Zeit verstrichen ist.
Ich sehe dass das Problem durch mein static tRest kommt, da hier immer um 1 dekrementiert wird. Eine Lösung sehe ich aber gerade leider nicht.
Wäre lieb wenn mir einer helfen könnte.
Gruß
Vertax
-
hi
viel zu viel code für so eine simple aufgabe ...
guck dir mal die funktion kbhit an
-
Hi, erstmal danke für ne Antwort.
Ich habs gestern Abend gelöst und hab meinen Timer anders aufgebaut:
void initilizeTimer() { static clock_t prgstart, prgende; static int first=0; int currentTime = 0; static int timer = 30; if(first == 0){ prgstart=clock(); first = 1; } prgende=clock(); currentTime = (prgende-prgstart)/ CLOCKS_PER_SEC; system("cls"); printf("%70s%d\r"," ",timer-currentTime); Refresh(NULL); while(currentTime <= 30 && !kbhit()) { prgende=clock(); currentTime = (prgende-prgstart)/ CLOCKS_PER_SEC; system("cls"); printf("%70s%d\r"," ",timer-currentTime); Refresh(NULL); } if( currentTime >= 30 ) exit(0); }
So funktioniert das ganze, ich verstehe aber nicht wieso ich mir kbhit() anschauen sollte?