PDA

Visualizza la versione completa : [C] Countdown timer in tempo reale


nasuka89
22-05-2012, 12:23
Volevo fare un coutdown in tempo reale che permettesse all'utente di vedere il tempo che gli mancava ma allo stesso tempo di poter digitare dei caratteri.
Questa Ŕ la funzione base:


void countDown (int secondi){ // funzione per il conto alla rovescia



if (secondi <=0)
return;

while (secondi > 0){
printf("- %d",secondi); // mostro il contatore discendente
Sleep(1000); // il programma dorme per un secondo
secondi--;
}

}



Ho fatto vari tentativi usando tipo kbhit() ma non sn riuscito.

oregon
22-05-2012, 12:36
Se lo Sleep ferma il thread per un secondo, il processo non risponderÓ per quel secondo.

E dove sta la kbhit ?

nasuka89
22-05-2012, 17:20
no diciamo che quella era la versione da cui volevo partire.. volevo eseguirla nel main mentre l'utente doveva inserire la parola per cui il ciclo con la kbhit() lo avevo nel main.. lo sleep lo usavo per fermare il processo per un secondo e infatti non risponde

oregon
22-05-2012, 17:23
Usa un thread separato per il conteggio.

ESSE-EFFE
22-05-2012, 17:57
Originariamente inviato da nasuka89
no diciamo che quella era la versione da cui volevo partire.. volevo eseguirla nel main mentre l'utente doveva inserire la parola per cui il ciclo con la kbhit()

Per quale OS ti serve?

nasuka89
22-05-2012, 22:19
provo se riesco a fare un thread separato allora..
mi serve per windows

ESSE-EFFE
23-05-2012, 09:32
Originariamente inviato da nasuka89
provo se riesco a fare un thread separato allora..
mi serve per windows
Allora prova a dare un'occhiata al codice che segue. Non Ŕ completo (anche se compila), per˛ dovrebbe darti un'idea su come generare il countdown e soprattutto come visualizzarlo nello stesso punto a video. Non fa uso di thread secondari.




#include <stdio.h>
#include <conio.h>
#include <windows.h>

HANDLE sout;

void print_timer(int secs)
{
CONSOLE_SCREEN_BUFFER_INFO sbi;
COORD c;

GetConsoleScreenBufferInfo(sout, &sbi);

c.X = 40;
c.Y = 5;
SetConsoleCursorPosition(sout, c);

printf("%5d", secs);

SetConsoleCursorPosition(sout, sbi.dwCursorPosition);
}

int main()
{
int secondi, esci, c;
DWORD t1 = 0, t2;
sout = GetStdHandle(STD_OUTPUT_HANDLE);

secondi = 10 + 1;
esci = 0;

while ((secondi > 0) && (esci == 0))
{
t2 = GetTickCount();
if ((t2 - t1) >= 1000)
{
print_timer(--secondi);
t1 = t2;
}

if (kbhit())
{
c = getch();
if (c == 0x0D)
esci = 1;
else
printf("%c", c);
}
}

if (esci)
printf("\n\nOK");
else
printf("\n\nTEMPO SCADUTO");

getch();

return 0;
}

nasuka89
23-05-2012, 16:08
ESSE-EFFE grazie delle dritte

Loading