View Full Version : Come catturare gli interrupt da tastiera con C?
Ciao a tutti!
Ultimamente sto scrivendo un programmino in C che, tra le tante funzioni, ha la necessità di catturare un Interrupt dato da tastiera (es la pressione di un determinato tasto) in Run Time (ad esempio, per fermare un conto alla rovescia)
E' possibile? Che funzioni posso invocare? A che librerie devo fare riferimento?
Ciao!
Sotto Windows non puoi accedere direttamente a queste cose (a meno che tu non stia programmando per DOS)... L'unica cosa è usare le API ed intercettare un messaggio WM_KEYDOWN e dopo verificare il tasto premuto...
Per effettuare il countdown puoi inizializzare un timer che ti controlla l'orologio di sistema ogni decimo di secondo (mettere un timer ogni secondo è probabilemnte meno preciso (non c'è garanzia di esecuzione entro quell'intervallo preciso, quindi dopo 100 conteggi potrebbero anche essere passati 101 secondi ;))...
Se lo dicevi prima ;)
Con le ncurses:
http://vlsm.org/linux-archive/i6/msg00210.html
Guarda il ciclo (quel while(1))...
Esce quando c (il carattere letto) è un carattere valido (ovviamente la parte importante che ti permette di fare così è quella sopra, altrimenti la getch sarebbe bloccante)...
In pratica tu farai un ciclo del genere:
time_t told, tnew;
time(&told);
while(conteggio < MAX)
{
sleep(10); /*oppure fai lavorare la tua appplicazione*/
time(&tnew);
conteggio += (int)difftime(tnew, told);
told = tnew;
if((c = getch()) != ERR) break; /*se è un tasto valido esco dal ciclo*/
}
Altro link utile:
http://www.linuxquestions.org/questions/showthread.php?s=&threadid=34027
Questa è una cosa diversa...disattiva il line buffering dello stdin...
Sotto linux potresti anche usare le syscall kill e signal
man 2 kill
man signal
Ziosilvio
19-04-2004, 01:48
Originariamente inviato da Stobby
Ultimamente sto scrivendo un programmino in C che, tra le tante funzioni, ha la necessità di catturare un Interrupt dato da tastiera (es la pressione di un determinato tasto) in Run Time (ad esempio, per fermare un conto alla rovescia)
E' possibile? Che funzioni posso invocare? A che librerie devo fare riferimento?
In C standard, non è possibile.
Questo semplicemente perché gli interrupt e la loro cattura dipendono dall'architettura hardware della macchina su cui gira il programma.
Consulta il manuale del compilatore.
Se stai lavorando sotto Windows o sotto Linux, segui anche i consigli degli altri utenti.
P.S.: Una cosa che si può fare in C standard, invece, è rilevare la pressione del tasto Invio.
Non è proprio così, in realtà, ma l'effetto del codice:
while (getchar() != '\n')
;
è proprio quello di non fare niente finché non viene inserita da tastiera una sequenza di caratteri terminata da Invio, e poi scartarli tutti: il che è una simulazione accettabile della rilevazione della pressione del tasto Invio.
Originariamente inviato da Ziosilvio
è proprio quello di non fare niente finché non viene inserita da tastiera una sequenza di caratteri terminata da Invio, e poi scartarli tutti: il che è una simulazione accettabile della rilevazione della pressione del tasto Invio.
L'attesa attiva (cioè quella in cui il processo che attende occupa inutilmente la CPU) non è mai accettabile ;)
Qualche cosa di buono l'ho comunque trovata sfruttando le librerie non standard curses incluse in Linux... svolgono egregiamente (per quello che mi servono ora) il loro dovere :)
Grazie ragazzi!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.