La destinazione dei messaggi cout in un programma GUI

1

Ho creato alcune classi e funzioni in una libreria statica che ha la familiare stampa di messaggi di testo in stdout :

cout << "Hello World!" << endl;

Ho sviluppato questa libreria per l'uso in un'applicazione console, ma sto anche pensando di creare una versione GUI, perché sarà sia utile che altamente educativa (per me).

Mi chiedo come sia possibile produrre output in una libreria inviata a entrambi i controlli stdout e GUI (come una barra di stato o una finestra popup). Dal momento che tali messaggi sono tutti inviati (nel mio caso comunque) a una destinazione (cout), potrebbe essere possibile una sorta di reindirizzamento?

Ho sempre pensato che una cosa del genere potesse essere possibile in quanto le persone rilasciano spesso versioni a riga di comando e GUI dei loro programmi.

    
posta Axolotl9250 19.06.2014 - 02:30
fonte

2 risposte

3

cout scrive sempre sul flusso di output standard ( stdout ). Se si desidera che l'output venga reindirizzato altrove (ad esempio una finestra grafica), sarà necessario reindirizzare l'output a un altro programma o thread responsabile della gestione dell'interfaccia grafica. Ci sono molti modi in cui questo può essere fatto, ma dipende in qualche modo dal sistema operativo.

Per impostazione predefinita, su Linux è possibile osservare lo stdout di entrambi i programmi di console e grafici semplicemente eseguendolo da un terminale. In realtà, non c'è distinzione netta tra "console" e programmi "grafici" in Linux.

Su Windows è piuttosto diverso: console e programmi grafici sono distinti *. I programmi grafici non hanno un terminale assegnato per impostazione predefinita, quindi i messaggi stdout di solito finiscono nell'oblio. C'è un po 'di trucco richiesto allocare un terminale per programmi grafici (in modo che si comportino in modo simile a Linux).

(Non posso commentare sui Mac perché non li uso.)

Puoi eseguire reindirizzamenti esternamente tramite la shell. Qui presumo una shell di tipo Bourne. ** Supponiamo che tu voglia eseguire un programma my-simulation e alimentare il suo output ad un altro programma my-display , che presumibilmente legge dallo standard input ( stdin ). Se si esegue il programma così com'è, l'output verrà scaricato nel terminale come al solito:

./my-simulation

Puoi stabilire una pipe eseguendo quanto segue nella shell:

./my-simulation | ./my-display

O se invece vuoi scrivere su un file,

./my-simulation >my-output-file.txt

Naturalmente, questi possono essere tutti fatti in C / C ++, ma con più lavoro. Se vuoi che stdout venga reindirizzato a un file, puoi utilizzare freopen dallo standard biblioteca. Il reindirizzamento di stdout a un altro processo è leggermente più difficile in quanto è necessario utilizzare API specifiche della piattaforma per gestire i descrittori di file e piping di processi.

[*] Nel linguaggio Windows, i programmi grafici sono chiamati Applicazioni Windows . Puoi trovare ulteriori informazioni sulle varie differenze tra questi due tipi di programmi su MSDN .

[**] Puoi anche fare qualcosa di simile con il prompt dei comandi su Windows, ma con una sintassi leggermente diversa.

    
risposta data 19.06.2014 - 04:30
fonte
0

Quello che vorrei fare è produrre ciò che vuoi in un osstream e con questo osstream posso usarlo per visualizzare l'output su qualsiasi front end che voglio, sia esso messaggio della console o della finestra, ecc.

    
risposta data 19.06.2014 - 05:03
fonte

Leggi altre domande sui tag