2010-10-15 8 views
10

Sto usando C (gcc) e ncurses, per creare un programma che monitorerà i dati provenienti dalla porta seriale. Il programma ha un grande while, dove si legge i dati provenienti dal porto e, allo stesso tempo, esso stampa che informazioni nella schermata ...Come ottenere input dalla tastiera mentre si fanno altre cose allo stesso tempo?

Ma il problema è qui:

Come si può leggere input dalla mia tastiera, (dal getch() congela il programma fino a quando non riceve un input) e allo stesso tempo leggi le informazioni provenienti dalla porta?

Forse dovrò usare un altro modo (non il grande while), quindi le idee sono ben accette!

+0

È possibile esaminare i thread: http://en.wikipedia.org/wiki/Thread_(computer_science) – sje397

+3

o 'select()', a tale proposito. –

risposta

8

fanno getch una chiamata non bloccante utilizzando nodelay opzione.

nodelay(stdscr,TRUE); 

Maggiori informazioni sono disponibili all'indirizzo http://www.gsp.com/cgi-bin/man.cgi?topic=nodelay

+0

Esattamente quello che stavo cercando! Grazie!! – Tomas

+2

http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/ puoi imparare molto da qui. – Rozuur

+2

Quel collegamento in realtà non menziona 'nodelay()' – Wutaz

0

seconda dell'ambiente di voi forse avete la funzione kbhit(), è picco proprio nel buffer della tastiera e restituisce non zero se c'è una chiave lì - allora puoi fare getch().

(conio.h)

0

Forse la forcella()? Basta tenere a mente che il bambino viene eseguito in un processo separato in modo da variabili non possono essere condivisi direttamente tra di loro

pid_t pID = fork(); 
if (pID == 0) {    // child 
    // Code executed only by child process 
    // getch() ... 
} else if (pID < 0) {   // failed to fork 
    // Throw exception 
    // ... 
} else {      // parent 
    // Code executed only by parent process 
    // ... 
} 
+0

Sì, so che questo può causare mal di testa - caveat emptor. – belwood

+1

È un modo elegante ... Non lo sapevo. Ma quando lavoro con ncurses, penso che l'opzione nodelay sia più semplice. – Tomas

0

Prova select() o poll(). Entrambi fanno la stessa cosa, ma con interfacce diverse. Gli dai un elenco di descrittori di file, e aspetterà che almeno uno di questi descrittori sia pronto, quindi ritorna e ti dirà quali possono essere letti (o scritti) senza bloccare. Controlla i link per esempi e maggiori dettagli.

-1

uso cbreak() per disabilitare la linea di buffering

nodelay(win, TRUE); 

questo ti porterà un getch() funzione di non bloccante.

+0

Questo continuerà a bloccarsi finché non viene premuto un tasto. – Wutaz

Problemi correlati