2010-09-27 19 views
10

Ho un piccolo programma ncurse in esecuzione, ma l'output non sembra presentarsi a meno che non attacchi il wrefresh() in un ciclo while.NCurses Refresh

C'è qualche buffer in corso o qualcosa del genere? Ho provato altre funzioni refresh nella libreria e fflush con stddout (che non credo abbia senso, ma vale la pena provarlo), ma niente sembra funzionare.

Una seconda piccola domanda: per rendere getch() non bloccante, è necessario chiamare nodelay(win,TRUE), giusto?

 

void main() 
{ 
     initscr(); 
     start_color(); 
     init_pair(1,COLOR_YELLOW,COLOR_CYAN); 
     WINDOW *win = newwin(10,10,1,1); 
     wbkgd(win,COLOR_PAIR(1)); 
     wprintw(win,"Hello, World."); 
     wrefresh(win); 
     getch(); 
     delwin(win); 
     endwin(); 
} 
 
+0

Ho aggiunto il seguente codice: while (ERR == getch()) { wrefresh (win); ++ ctr; } e l'output sembra buono, ma ancora non capisco perché inizialmente non viene visualizzato senza il loop. – Tim

risposta

17

Non è possibile combinare operazioni su stdscr e finestre create con newwin(). getch() funziona su stdscr, quindi questo è il tuo problema. Sostituire la chiamata con

wgetch(win); 

(getch() sta causando stdscr essere oggetto di dumping sopra la parte superiore del vostro altra finestra, e perché ciò accade così in fretta sembra che l'altra finestra non ha mai avuto mostrata a tutti).

+0

Giusto. Grazie mille! Scusate, ma ho bisogno di chiedercene un'altra: quando chiamate una funzione che opera su una finestra, mette a fuoco la finestra se c'è una cosa come messa a fuoco? – Tim

+0

@Tim: il cursore hardware è lasciato nella posizione del cursore nella finestra che hai aggiornato l'ultima volta, ma questo è davvero l'unico tipo di "messa a fuoco". – caf

+0

Se sono necessarie finestre di sovrapposizione indipendenti, è necessario consultare la libreria dei pannelli che fa parte di ncurses. – Craig

2

che sta lavorando come progettato. Ciò consente di ridisegnare completamente la schermata successiva, ma solo le parti effettivamente modificate vengono inviate al terminale al momento del rinfresco. Questo non è un grosso problema in questi giorni ma ha fatto una grande differenza quando le connessioni terminali erano relativamente lente.

+0

Grazie per la risposta. Capisco che sia così, ma non vedo altro che uno schermo vuoto. Come faccio a visualizzare la finestra e il testo * inizialmente * senza chiamare ripetutamente wrefresh()? – Tim