Progress Bar in C#

Pubblicità

Allfreeware

Utente Attivo
Messaggi
193
Reazioni
0
Punteggio
38
Ciao a tutti.
Ho un problema::help:
Ho un programma che usa un algoritmo per criptare file,però quando i file sono di 10KB va' bene.Ma se i file iniziano ad essere sul MB allora il software ci impiega molto tempo.Così ho la necessità di inserire una Progress Bar per controllare l'avanzamento del file.Ora,so' come visualizzarla e come incrementarne il valore ma non so' come controllare a che punto è il file.:look:
C'è qualche comando per farlo?
Grazie.:chupachup

Ps: se servono più informazioni ditelo.
 
mmm, mi sa che ti tocca farlo a mano...

tipo così :

- ti leggi la dimensione del file (diciamo in KB)
- ad ogni blocco del file che scarichi ti aggiorni un contatore che ti tiene il conto di quanti KB hai scaricato
- ti calcoli la percentuale del file che hai già scaricato e setti il valore sulla progress bar
 
Arcovoltaico77 ha detto:
mmm, mi sa che ti tocca farlo a mano...

tipo così :

- ti leggi la dimensione del file (diciamo in KB)
- ad ogni blocco del file che scarichi ti aggiorni un contatore che ti tiene il conto di quanti KB hai scaricato
- ti calcoli la percentuale del file che hai già scaricato e setti il valore sulla progress bar

Esatto, la soluzione di Arcovoltaico77 va bene se vuoi far vedere le percentuali :)

oppure, se a te serve solo l'avanzamento, setti come valore massimo della progress bar la dimensione del file e, ad ogni blocco processato, incrementi il valore della progress bar.

Ciao!
 
Un apio di cose.
Cosa intendete per "ad ogni blocco processato"?
e come faccio a sapere la dimensione del file finale?
Grazie.:ok:
 
ah, avevo letto male, mi sembrava che fosse un trasferimento di un file via http/ftp ...

se hai il file in locale è anche più facile, nelle librerie di gestione dei file dovresti avere un metodo che ti dà la dimensione di un file (qualcosa tipo "getFileSize", la sparo lì :D)

per la questione del "blocco processato", se hai il sorgente del blocco processato sicuramente vedrai che all' interno c'è un qualche ciclo (for/while);
per ogni passaggio al' interno di quel ciclo (alla fine del ciclo stesso, ovviamente) potresti ricalcolare la percentuale...

Se invece l' algoritmo è in una libreria dll o simili, vedi se la libreria ha metodi che ti ritornano la percentuale di completamento...

Oppure la progress bar la fai in modo che giri di continuo, senza percentuale (inutile, ma meglio di nulla, dà l' impressione che non sia tutto piantato:asd:)
 
L'ultima idea non è male:lol:.
Però con quel metodo della dimensione il file criptato dovrebbe avere al stessa dimensione di quello prima del criptaggio..devo fare alcune prove per verificare...
Per il discorso del ciclo,sì,ho capito,ma posso determinare il numero di cicli che deve fare solo se sono file di tsto,per altri tipi di file non posso determinare quanti cicli mancano.:boh:
Grazie.:ok:
 
Beh, per gli altri file, probabilmete leggerà un pezzetto di file alla volta (che ne so, 512 bytes :) ) quindi tu se hai un file di 2048 bytes avrai 4 cicli.

Ciao!
 
In teoria dovrebbe prendere il file byte per byte.
Vi posto il codice.
Codice:
{
                ///////////////////////////////////////////////////////
                byte[] rijnKey = new byte[8] { //chiave, };
                byte[] rijnIV = new byte[16];
                FileStream fin = new FileStream("" + (cont1) + (cont2), FileMode.Open, FileAccess.Read);
                FileStream fout = new FileStream("" + (cont1) + (cont3), FileMode.OpenOrCreate, FileAccess.Write);
                fout.SetLength(0);
                byte[] bin = new byte[10];
                long rdlen = 0;
                long totlen = fin.Length;
                int len;
                SymmetricAlgorithm rijn = SymmetricAlgorithm.Create("Rijndael");
                CryptoStream encStream = new CryptoStream(fout, rijn.CreateDecryptor(rijnKey, rijnIV), CryptoStreamMode.Write);
                Console.WriteLine("Crittazione in corso...");
                while (rdlen < totlen)
                {
                    len = fin.Read(bin, 0, 10);
                    encStream.Write(bin, 0, len);
                    rdlen = rdlen + len;
                    Console.WriteLine("{0} bytes elaborati", rdlen);
                }
                encStream.Close();
                fout.Close();
                fin.Close();
            }

E' un normale algoritmo rijandael.Se controlla byte per byte ho capito come fare,Grazie.:chupachup
 
praticamente c' hai già tutto fatto eheh...

la dimensione del file ce l' hai nella variabile totlen,
la somma dei byte letti ce l'hai nella variabile rdlen,
la lettura legge massimo 10 byte alla volta e li mette nella var. bin, mentre nella var. len c'è scritto quanti dei 10 byte ha effettivamente letto l' ultima operazione di lettura.

Basta che fai (rdlen/totlen)*100 , dovrebbe uscire la percentuale (da 0 a 100) di completamento della progress bar :ok:
 
Ehm...piccolo errore...cioè non propio errore però.
In pratica adesso la barra va',però si riempie solo quando ha finito tutto,non per gradi.

Codice:
                while (rdlen < totlen)
                {
                    len = fin.Read(bin, 0, 10);
                    encStream.Write(bin, 0, len);
                    rdlen = rdlen + len;
                    Console.WriteLine("{0} bytes elaborati", rdlen);
                    int lettura = (int)rdlen;
                    int letturamax = (int)totlen;
                    progressBar1.Value = ((lettura / letturamax) * 100);
                }
                encStream.Close();
                fout.Close();
                fin.Close();
                {
                    MessageBox.Show("Informazioni salvate", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }
            }
La classe della barra:

Codice:
        private void progressBar1_Click(object sender, EventArgs e)
        {
            progressBar1.Maximum = 100;
            progressBar1.Minimum = 0;
        }

Praticamente il problema è che controlla il valore solo alla fine di tutto...
 
ma perchè i limiti inferiore e superiore della progressbar li imposti sull' evento OnClick della progressbar stessa? io l' avrei messi all' avvio del programma, li setti una volta all' avvio e basta...

per il problema dell' aggiornamento, potrebbe essere che, non essendo il codice multithread, l' aggiornamento della barra non fà in tempo ad essere processato durante la codifica del file, per cui lo vedi solo alla fine... (in java succede spesso, usando le form)...

Se è così, bisogna trovare un modo per far fare alla progressbar l' aggiornamento, da esempio eseguire la codifica del file in un altro thread...

Come prova "di emergenza", prova a chiamare il metodo della progressbar che la fà ridisegnare (sarà "repaint", o "redraw", o "refresh" o qualcosa del genere)
 
Ho provato a metterli separati ma allora anche se rendo tutto public mi dice che la varibile non esiste anche se è in una classe pubblica:boh:.

Cmq non so' come ridisegnare la barra:oogle:.
Ho guardato tutti i comandi di progressBar1. , sono una trentina ma non c'è nessuno che somigli a qualcosa che ricrea:oogle::boh:
 
Le due proprietà Minimum e Maximum vanno impostate
- a "design time" , cioè dalla form (usi Visual Studio o BDS 2006?)
- via codice, nella classe della form, dopo che l' oggetto stesso è stato dichiarato e reso visibile

se lavori all' interno della stessa classe della form , non dovresti avere problemi di visibilità...
 
Pubblicità
Pubblicità
Indietro
Top