Come si progetta un buffer per una console?

3

Problema

Ho un widget grafico della console che riceve l'output da un interprete. Sfortunatamente la console non è abbastanza veloce per dipingere l'output in tempo reale. Quindi ho dovuto implementare un buffer (FIFO Thread Safe Queue) che ritardava le scritture sulla console di 5 ms. Quindi, quando normalmente un ciclo di 1000 stampe sarebbe fatto in meno di 1 ms, ci vorrebbero 5000ms per stampare tutto.

Diagramma di sequenza per il buffer:

sendCode : invia il codice che l'interprete può compilare ed eseguire.

writeLine : scrivi l'output dall'interprete al buffer.

startTimer : avvia un timer che va in timeout ogni 5 ms.

getLine : recupera la riga più vecchia del buffer. Chiamato ogni 5 ms.

line : riga che viene inviata alla console in cui viene visualizzata.

Che cosa ho bisogno

Mentre questa strategia di ritardare l'output funziona per ora, non è molto pratico quando sono necessarie soluzioni in tempo reale. Conosco un'altra strategia che consiste nell'impostare una dimensione del buffer. Quindi, quando viene raggiunta la dimensione del buffer, svuotare l'output. Questa è una strategia molto migliore in quanto la console non sarà soffocante considerando che le linee vengono inviate in blocchi.

Ma il problema è che se imposto una dimensione del buffer di 50 righe, l'utente non vedrà alcun output fino a quando non saranno stampate 50 righe. Ridurre la dimensione del buffer non è di grande aiuto, perché in questo caso si intende ridurre lo stress sulla console.

Come posso creare un sistema di buffer in modo che l'output venga stampato in tempo reale pur non avendo la console morire di me.

    
posta daegontaven 12.09.2017 - 09:10
fonte

2 risposte

8

Per aggiungere più carne alle ossa dei commenti di Wikiti.

È necessario un buffer di dimensioni fisse e un timer impostato su n ms.

  1. Quando scrivi il codice nel buffer, se il buffer era vuoto, (ri) avvia il timer a n ms.

  2. Se scrivi sul buffer ed è pieno, scaricalo alla console, cancella il buffer e ferma il timer.

  3. Se il timer scade e c'è del codice nel buffer, svuotalo nella console, svuota il buffer e interrompi il timer.

  4. Se il timer scade e non c'è codice nel buffer, interrompi il timer.

Questo algoritmo dovrebbe essere sufficiente. Potrebbe essere necessario un po 'di tentativi ed errori per ottenere un buon bilanciamento della dimensione del buffer e del ritardo del timer per ottenere l'interazione della console più fluida. Puoi anche trovare un po 'di chilometraggio per rendere il flush / clear / stop disponibile come una funzione di flush manuale sebbene questo non sia strettamente necessario.

    
risposta data 12.09.2017 - 12:50
fonte
0

È necessaria una raccolta di dati FIFO della coda sicura dei thread (autoprocessata tramite blocchi o librerie), che rimuove il primo messaggio nel buffer in caso di overflow. L'interfaccia utente || Console Thread interroga la struttura dei dati e pop ogni cosa se c'è qualcosa da stampare (il buffer contiene dati). - > Non aspettare che il buffer sia pieno.

Tutti i messaggi hanno una data e ora in cui sono inseriti e una priorità. Elimina tutti i messaggi obsoleti in combinazione con il timestamp.

Inoltre aumenta la dimensione del buffer della tua console. Non conosco alcuna console che muoia a causa di troppe chiamate a printf () o wrapper di.

    
risposta data 12.09.2017 - 11:16
fonte

Leggi altre domande sui tag