Autore Topic: ProgressBar per terminale  (Letto 481 volte)

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.271
  • Chi parla poco dice tanto...
    • Mostra profilo
ProgressBar per terminale
« il: 20 Gennaio 2022, 08:11:40 »
Ciao a tutti.... Mi sono imbattuto in questi giorni in un progetto per l'aggiornamento di tabelle su database postgresql con sorgente remoto su database firebird.

Siccome ho utilizzato un port forwarding con ssh e avendo una connessione (in questo caso nella nostra sede in Francia) molto lenta, ho creato questo piccolo componente per verificare che il programma stesse lavorando oppure no.

Naturalmente ci ho messo piu' tempo a documentarmi per sviluppare il progress bar per terminale che non la procedura di estrazione dati, come dire 'unire l'inutile al dilettevole'  :rotfl:

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.157
  • Tonno verde
    • Mostra profilo
Re:ProgressBar per terminale
« Risposta #1 il: 20 Gennaio 2022, 10:07:02 »
Scaricato, grazie  :)
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.287
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:ProgressBar per terminale
« Risposta #2 il: 21 Gennaio 2022, 03:13:19 »
...io m'ero inventato una cosa così: :-X
Codice: [Seleziona]
Private Const LUNGHEZZA As Byte = 50


Public Sub Main()
 
  Dim b, c As Byte
 
  For b = 1 To LUNGHEZZA
    Inc c
    Write "\r" & String(b, "=") & "]" & Space(LUNGHEZZA + 1 - b) &
          CStr(c * (100 / LUNGHEZZA)) & "%"
    Flush
    Wait 0.1
  Next
 
End

Se si vuole avere un effetto grafico di barra "alla Milio ", la riga con la funzione "Write" dovrà essere cambiata così:
Codice: [Seleziona]
Write "\r\e[42m" & Space(b) & "\e[0m" & Space(51 - b) & CStr(c * (100 / LUNGHEZZA)) & "%"
« Ultima modifica: 21 Gennaio 2022, 16:49:31 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.271
  • Chi parla poco dice tanto...
    • Mostra profilo
Re:ProgressBar per terminale
« Risposta #3 il: 21 Gennaio 2022, 14:38:55 »
Flush!!!!!!! Era Flush!!!!! Ecco perche' non mi scriveva nel terminale..... GRAZIE Vuott!!!!!!! :ok: :ok: :ok: :ok: :ok:

Allego inutilità corretta....

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.287
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:ProgressBar per terminale
« Risposta #4 il: 21 Gennaio 2022, 22:59:59 »
...ecco comunque un esempio pratico, nel si mostrerà lo stato d'avanzamento in percentuale della copia di un file:
Codice: [Seleziona]
Private Const LUNGHEZZA As Byte = 50


Public Sub Main()

 Dim fl1, fl2 As File
 Dim b, c As Byte
 Dim k As Integer
 Dim orig, s As String

 orig = "/percorso/del/file/da/copiare"

 fl1 = Open "/tmp/copia" For Create  ' Percorso ove ad esempio il file verrà copiato
 fl2 = Open orig For Read

 k = (Lof(fl2) \ 100)
 c = 100 \ LUNGHEZZA

 Repeat
   Inc b
   If b < 101 Then
     Write "\r" & String(b \ c, "=") & "]" &
           Space(LUNGHEZZA + 1 - (b \ c)) & CStr(b) & "%"
     Flush
   Endif
   Read #fl2, s, -k
   Write #fl1, s, -k
 Until Eof(fl2)

 fl2.Close
 fl1.Close

 If Stat("/tmp/copia").Size == Stat(orig).Size Then Print "\nCopia del file avvenuta con successo."

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »