PDA

View Full Version : Come catturare gli interrupt da tastiera con C?


Stobby
18-04-2004, 11:13
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!

cionci
18-04-2004, 11:17
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 ;))...

Stobby
18-04-2004, 11:20
e sotto LInux?

cionci
18-04-2004, 11:44
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*/
}

cionci
18-04-2004, 11:46
Altro link utile:
http://www.linuxquestions.org/questions/showthread.php?s=&threadid=34027

Questa è una cosa diversa...disattiva il line buffering dello stdin...

cn73
18-04-2004, 14:21
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.

cionci
19-04-2004, 03:18
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 ;)

Stobby
19-04-2004, 21:03
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!