PDA

Visualizza la versione completa : [C] Stampare un carattere in una zona specifica dello schermo...


MonsterMash
07-06-2008, 01:19
Salve,
forse il titolo di questa discussione non lascia capire bene cosa voglio fare, adesso cercherò di spiegarmi meglio.

Durante l'esecuzione di un programma ho la necessità di avere su schermo diverse informazioni, e di poterne osservare l'evoluzione. Quello che mi servirebbe quindi è di poter scrivere un elenco di valori e di modificarli singolarmente senza dover ristampare a schermo l'intera lista. Ad esempio una cosa del tipo:

Processo 'a' completato al X%
Processo 'b' completato al Y%
Processo 'c' completato al Z%
etc...

E poter poi modificare solo i valori di X, Y e Z senza dover ristampare tutto. Io per l'output conosco solo le funzioni dell'ANSI C, e non mi pare che con quelle si possa fare.

Spero sappiate aiutarmi :)

Grazie, ciao.

oregon
07-06-2008, 08:30
Con Windows, puoi usare le API per la gestione della console (ad esempio la SetConsoleCursorPosition) che trovi documentate su MSDN.

810106
07-06-2008, 11:05
Puoi usare gli escape ANSI cosi il tuo programma è piu portabile:



printf("\033[%d;%dH", LINEA, COLONNA);


Fatti una ricerca con google: "ANSI escape sequence" vedrai quanti miliardi di cose puoi fare con questi
codici... persino cambiare il comportamento dei pulsanti, cambiare caratteri.... vedi un pò è
interessante ed è uno standard de facto! :)

metal_prog
07-06-2008, 16:37
Se il tuo programma si basa sul prompt dei comandi di Windows basta usare system("clr"); per cancellare lo schermo...

MItaly
07-06-2008, 18:15
Puoi usare gli escape ANSI cosi il tuo programma è piu portabile:
Su Windows non funzionano.

Se il tuo programma si basa sul prompt dei comandi di Windows basta usare system("clr"); per cancellare lo schermo...
Sarebbe system("cls"), ma comunque conviene usare le API.

MonsterMash
07-06-2008, 20:27
Grazie a tutti, peccato che gli escape ANSI non funzionino nella console di windows, sembravano veramente l'ideale...

Ho provato un po' con la SetConsoleCursorPosition, ma ho qualche problema, perchè il programma è multithread, e più thread tentano di prendere il controllo del cursore generando errori.

Il cls non lo uso semplicemente perchè non mi va di dover ristampare tutto su schermo, volevo poter modificare solo alcuni valori in specifiche posizioni. Anche per evitare lo sfarfallio che ne deriverebbe, e perchè con cls e la ristampa rallenterei mostruosamente l'esecuzione...

Mi sa che dovrò rinunciare...

Ciao

MItaly
07-06-2008, 20:53
Originariamente inviato da MonsterMash
Ho provato un po' con la SetConsoleCursorPosition, ma ho qualche problema, perchè il programma è multithread, e più thread tentano di prendere il controllo del cursore generando errori.

Evita di scrivere da più thread, memorizza invece le informazioni da scrivere in un contenitore thread-safe (che avrà come unità base l'"atomo" di informazioni da scrivere tutto insieme, corredato dalla posizione a cui scriverlo), in cui scriveranno tutti i thread e da cui invece leggerà un singolo thread, che si occuperà solo di effettuare la stampa a video.

MonsterMash
08-06-2008, 00:45
Originariamente inviato da MItaly
Evita di scrivere da più thread, memorizza invece le informazioni da scrivere in un contenitore thread-safe (che avrà come unità base l'"atomo" di informazioni da scrivere tutto insieme, corredato dalla posizione a cui scriverlo), in cui scriveranno tutti i thread e da cui invece leggerà un singolo thread, che si occuperà solo di effettuare la stampa a video.

Purtroppo è un po' più complicato, perchè non si tratta semplicemente di un programma con più thread, ma di un programma realizzato con le librerie mpich, e quindi alcuni thread girano sulla stessa macchina e sulla stessa console, altri su macchine diverse connesse via rete tra loro. Potrei usare le funzioni di mpi per far passare da ogni processo le informazioni da stampare al processo 0, ma la cosa si complicherebbe un po', e poi mi è stato raccomandato di limitare solo ai messaggi indispensabili il passaggio di informazioni tra i vari processi, onde evitare di saturare la banda e far degradare le prestazioni. Inoltre il mio scopo sarebbe quello di stampare le informazioni non solo sulla console del processo 0 (o meglio, della macchina su cui gira il processo 0), ma su tutte quelle disponibili...

Cmq ho usato le API di windows consigliatemi da oregon nella versione sequenziale del software, e funzionano alla perfezione :).

Grazie a tutti.
Ciao

Loading