Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - stoppare un cronometro
Forum - C/C++ - stoppare un cronometro

Avatar
VoV (Ex-Member)
Newbie


Messaggi: 7
Iscritto: 29/11/2008

Segnala al moderatore
Postato alle 16:02
Venerdì, 12/06/2009
B.Giorno a tutti...sto cercando di creare un semplice cronometro e direi che lo scorrere del tempo non è un problema...il problema si tratta nel fermarlo :(
infatti essendo un ciclo infinito pensavo che per uscirne servisse la funzione break; ma a quanto pare non è così
qualcuno saprebbe dirmi esattamente perchè non funzioni e eventualmente se ha una soluzione per stoppare il tempo?
il source è questo
Codice sorgente - presumibilmente C++

  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4.  
  5. #define spazio 32
  6. #define PREMUTO -32767
  7.  
  8. int main()
  9. {
  10.         int ore = 0;
  11.     int minuti = 0;
  12.     int secondi = 0;
  13.    
  14.     printf("\n");
  15.         for(;;){
  16.             if(GetAsyncKeyState(spazio)==PREMUTO){
  17.                   break;
  18.                   }
  19.                   else{
  20.                        do
  21.                        {
  22.                          do
  23.                          {
  24.                           printf("\r Cronometro %02d:%02d:%02d ", ore, minuti, secondi);
  25.                           Sleep(1000);
  26.                           secondi++;
  27.                           }
  28.                   while(secondi < 60);
  29.                   secondi = 0;
  30.                   minuti++;
  31.                   }
  32.                 while(minuti < 60);
  33.                 minuti = 0;
  34.                 ore++;
  35.         }
  36.         }                                      
  37. }

ho provato anche a far si che venga rilevato il tasto premuto perchè non avevo idea di come fermarlo (anche se comunque non sembra servi a qualcosa), ma sarebbe comunque una soluzione scomoda

grazie per le risposte ^^

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:23
Venerdì, 12/06/2009
penso che il tuo problema sia questa riga di codice

Codice sorgente - presumibilmente Plain Text

  1. if(GetAsyncKeyState(spazio)==PREMUTO)



io non ho mai usato questa funzione ma le msdn dicono questo

Codice sorgente - presumibilmente C/C++

  1. SHORT GetAsyncKeyState(      
  2.     int vKey
  3. );



e sul valore di return specifica:

If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState. However, you should not rely on this last behavior; for more information, see the Remarks.

in poche parole il bit più significativo del numero ritornato dalla funzione ti dice se il tasto è premuto o meno; il bit meno significativo ti dice invece se il tasto è stato premuto o meno dall'ultima chiamata.

Quindi non capisco perchè fai il test con -32767...non esce dal ciclo perchè la funzione non assumerà mai quel valore.

PM Quote
Avatar
VoV (Ex-Member)
Newbie


Messaggi: 7
Iscritto: 29/11/2008

Segnala al moderatore
Postato alle 16:27
Venerdì, 12/06/2009
sisi, infatti, so che la parte sbagliata è quella o meglio io ho preso quella parte da un keylogger perchè era proprio l'ultima spiaggia visto che non sapevo come farlo uscire dal ciclo ho posto la condizione che se si preme il tasto "spazio" dovrebbe uscire dal ciclo, ma ho notato che non è così e non saprei come sistemarlo

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:41
Venerdì, 12/06/2009
prova a fare il test col valore 1, la documentazione dice che il bit è settato se il tasto è premuto

EDIT: cavolata!
prova a non farlo proprio il test.

scrivi solo if(getblabla(spazio))

Ultima modifica effettuata da il 12/06/2009 alle 16:44
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 17:14
Venerdì, 12/06/2009
Una applicazione console (in finestra DOS) tratta in modo diverso da una applicazione GUI il flusso dei messaggi provenienti dalla tastiera. La API in questione non potra' mai ottenere i tasti pressati perche' saranno intercettati dalla "message pump" che viene creata da Windows per la console stessa.

Puoi usare le "vecchie" funzioni kbhit/getch (includendo l'header conio.h) anche se non standard ... Il codice puo' essere riscritto cosi'

Codice sorgente - presumibilmente C++

  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <conio.h>
  5.  
  6. void crono()
  7. {
  8.     int ore = 0;
  9.     int minuti = 0;
  10.     int secondi = 0;
  11.  
  12.      
  13.     printf("\n");
  14.  
  15.         for(;;)
  16.         {
  17.                 do
  18.                 {
  19.                         do
  20.                         {
  21.                                 if(kbhit())
  22.                                         if(getch()==32)
  23.                                                 return;
  24.  
  25.                                 printf("\r Cronometro %02d:%02d:%02d ", ore, minuti, secondi);
  26.                                
  27.                                 Sleep(1000);
  28.                                 secondi++;
  29.                         } while(secondi < 60);
  30.  
  31.                         secondi = 0;
  32.                         minuti++;
  33.                 } while(minuti < 60);
  34.  
  35.                 minuti = 0;
  36.                 ore++;
  37.         }                                      
  38. }
  39.  
  40. int main()
  41. {
  42.         crono();
  43.  
  44.         return 0;
  45. }



PM Quote
Avatar
VoV (Ex-Member)
Newbie


Messaggi: 7
Iscritto: 29/11/2008

Segnala al moderatore
Postato alle 18:10
Venerdì, 12/06/2009
la funzione kbhit() non l'avevo mai sentita...ora mi informo

grazie mille per le risposte ^^

PM Quote