Progress Bar in C#

Allfreeware

Utente Attivo
193
0
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.
 

Arcovoltaico77

Utente Èlite
1,558
10
CPU
Core 2 Duo E2200 + Thermaltake silent tower 112cu (1,3 Kg)
Scheda Madre
Asus P5B
HDD
160Gb Maxtor SATA2 + WD Caviar 250GB SATA2
RAM
2 * 1Gb Corsair CL4 (Pc4300, Value Select)
GPU
Point of View 6600GT 256Mb (500-1000 @ 571-1183)
Audio
integrato 5.1
Monitor
LCD 17 samsung
PSU
Enermax Pro82+ 525 Watt
Case
ColorsIT
OS
Windows XP & Ubuntu
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
 

K.I.

Utente Èlite
1,644
7
CPU
Intel Prescott 530J con Zalman 7700CU
Scheda Madre
Asus P5GD2
HDD
Maxtor Sata 160Gb e Floppy
RAM
Micron 1024Mb
GPU
Asus 6600GT PCI-E
Audio
Onboard con Creative GD580
Monitor
HP F2105 e Scheda TV Terratec Cinergy 600TV
PSU
Enermax Noisetaker 485W
OS
Windowd XP e Kubuntu 7.04
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!
 

Allfreeware

Utente Attivo
193
0
Un apio di cose.
Cosa intendete per "ad ogni blocco processato"?
e come faccio a sapere la dimensione del file finale?
Grazie.:ok:
 

Arcovoltaico77

Utente Èlite
1,558
10
CPU
Core 2 Duo E2200 + Thermaltake silent tower 112cu (1,3 Kg)
Scheda Madre
Asus P5B
HDD
160Gb Maxtor SATA2 + WD Caviar 250GB SATA2
RAM
2 * 1Gb Corsair CL4 (Pc4300, Value Select)
GPU
Point of View 6600GT 256Mb (500-1000 @ 571-1183)
Audio
integrato 5.1
Monitor
LCD 17 samsung
PSU
Enermax Pro82+ 525 Watt
Case
ColorsIT
OS
Windows XP & Ubuntu
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:)
 

Allfreeware

Utente Attivo
193
0
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:
 

K.I.

Utente Èlite
1,644
7
CPU
Intel Prescott 530J con Zalman 7700CU
Scheda Madre
Asus P5GD2
HDD
Maxtor Sata 160Gb e Floppy
RAM
Micron 1024Mb
GPU
Asus 6600GT PCI-E
Audio
Onboard con Creative GD580
Monitor
HP F2105 e Scheda TV Terratec Cinergy 600TV
PSU
Enermax Noisetaker 485W
OS
Windowd XP e Kubuntu 7.04
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!
 

Allfreeware

Utente Attivo
193
0
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
 

Arcovoltaico77

Utente Èlite
1,558
10
CPU
Core 2 Duo E2200 + Thermaltake silent tower 112cu (1,3 Kg)
Scheda Madre
Asus P5B
HDD
160Gb Maxtor SATA2 + WD Caviar 250GB SATA2
RAM
2 * 1Gb Corsair CL4 (Pc4300, Value Select)
GPU
Point of View 6600GT 256Mb (500-1000 @ 571-1183)
Audio
integrato 5.1
Monitor
LCD 17 samsung
PSU
Enermax Pro82+ 525 Watt
Case
ColorsIT
OS
Windows XP & Ubuntu
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:
 

Arcovoltaico77

Utente Èlite
1,558
10
CPU
Core 2 Duo E2200 + Thermaltake silent tower 112cu (1,3 Kg)
Scheda Madre
Asus P5B
HDD
160Gb Maxtor SATA2 + WD Caviar 250GB SATA2
RAM
2 * 1Gb Corsair CL4 (Pc4300, Value Select)
GPU
Point of View 6600GT 256Mb (500-1000 @ 571-1183)
Audio
integrato 5.1
Monitor
LCD 17 samsung
PSU
Enermax Pro82+ 525 Watt
Case
ColorsIT
OS
Windows XP & Ubuntu

Allfreeware

Utente Attivo
193
0
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...
 

Arcovoltaico77

Utente Èlite
1,558
10
CPU
Core 2 Duo E2200 + Thermaltake silent tower 112cu (1,3 Kg)
Scheda Madre
Asus P5B
HDD
160Gb Maxtor SATA2 + WD Caviar 250GB SATA2
RAM
2 * 1Gb Corsair CL4 (Pc4300, Value Select)
GPU
Point of View 6600GT 256Mb (500-1000 @ 571-1183)
Audio
integrato 5.1
Monitor
LCD 17 samsung
PSU
Enermax Pro82+ 525 Watt
Case
ColorsIT
OS
Windows XP & Ubuntu
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)
 

Allfreeware

Utente Attivo
193
0
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:
 

Arcovoltaico77

Utente Èlite
1,558
10
CPU
Core 2 Duo E2200 + Thermaltake silent tower 112cu (1,3 Kg)
Scheda Madre
Asus P5B
HDD
160Gb Maxtor SATA2 + WD Caviar 250GB SATA2
RAM
2 * 1Gb Corsair CL4 (Pc4300, Value Select)
GPU
Point of View 6600GT 256Mb (500-1000 @ 571-1183)
Audio
integrato 5.1
Monitor
LCD 17 samsung
PSU
Enermax Pro82+ 525 Watt
Case
ColorsIT
OS
Windows XP & Ubuntu
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à...
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!