Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Visualizzare ProgressBar durante un Loop
Forum - C# / VB.NET - Visualizzare ProgressBar durante un Loop

Avatar
fosforo (Normal User)
Expert


Messaggi: 391
Iscritto: 06/04/2009

Segnala al moderatore
Postato alle 12:37
Venerdì, 09/10/2020
Ciao
Ho creato una form che contiene una Label e un ProgressBar.
Nella classe Form_Load ho una loop che da i valori sia alla Label che alla ProgressBar e chiamo una classe che copia semplicemente dei file da una cartella ad un'altra.

Purtroppo visualizzo la Label e la ProgressBar solo alla fine della copia.

Aggiungo il semlplice codice:
private void CopyFile_Load(object sender, EventArgs e)
        {
            progressBar1.Maximum = _file.Count;
            for (int i = 0; i < _file.Count; i++)
            {
                progressBar1.Value = i + 1;
                label1.Text = String.Empty;
                label1.Text = "COPYNG: " + _fileMissOdd;
                Copy_FileEven(i); // chiamo la copiaFile
                label1.Refresh();
                progressBar1.Refresh();
                this.Refresh();
            }
            label1.Text = "COMPLETE";
        }

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:25
Sabato, 10/10/2020
Cosa è la Copy_fileevent ??


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 2:03
Domenica, 11/10/2020
Testo quotato

Postato originariamente da fosforo:

Aggiungo il semlplice codice:
private void CopyFile_Load(object sender, EventArgs e)
        {
            progressBar1.Maximum = _file.Count;
            for (int i = 0; i < _file.Count; i++)
            {
                progressBar1.Value = i + 1;
                label1.Text = String.Empty;
                label1.Text = "COPYNG: " + _fileMissOdd;
                Copy_FileEven(i); // chiamo la copiaFile
                label1.Refresh();
                progressBar1.Refresh();
                this.Refresh();
            }
            label1.Text = "COMPLETE";
        }



Il codice che hai postato deve incrementare la progressbar ad ogni file copiato, e non mentre copia il file.
Il codice che hai postato se copia i file in modo sincrono e sembra di si, mentre esegue le operazioni di copia smetterà di aggiornare il form principale perché occupato in altri compiti, hai messo Refresh(), ma non è sufficiente, devi imporre l'aggiornamento del form ogni volta che un file è stato copiato, con DoEvents.
Codice sorgente - presumibilmente C# / VB.NET

  1. private void CopyFile_Load(object sender, EventArgs e)
  2.         {
  3.             progressBar1.Maximum = _file.Count;
  4.             progressBar1.Minimum = 0;
  5.  
  6.             for (int i = 0; i < _file.Count; i++)
  7.             {
  8.                 progressBar1.Value = i ;
  9.                 label1.Text = "COPYNG: " + _fileMissOdd;
  10.                 Copy_FileEven(i); // chiamo la copiaFile
  11.                 Application.DoEvents; // aggiorna il form, e altro
  12.             }
  13.             label1.Text = "COMPLETE";
  14.         }



Null'altro potrai fare mentre i file vengono copiati, se usi un metodo asincrono, potrai avere due progressbar una per i file copiati e una per il progresso del file in corso di copia.

Ultima modifica effettuata da Carlo il 11/10/2020 alle 2:14


in programmazione tutto è permesso
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 12:42
Domenica, 11/10/2020
Usa il tutto in un Thread separato.
dovresti risolvere il problema credo.


separa il codefile dal load form

Codice sorgente - presumibilmente C++

  1. private void CopyFile_Load(object sender, EventArgs e)
  2. {
  3.      Thread t = new Thread(CopyFile);
  4.      t.Start();
  5.  
  6. }
  7.  
  8.  
  9.  
  10. private void CopyFile()
  11.         {
  12.              Invoke(new Action(delegate
  13.                 {
  14.  
  15.             progressBar1.Maximum = _file.Count;
  16.             for (int i = 0; i < _file.Count; i++)
  17.             {
  18.                 progressBar1.Value = i + 1;
  19.                 label1.Text = String.Empty;
  20.                 label1.Text = "COPYNG: " + _fileMissOdd;
  21.                 Copy_FileEven(i); // chiamo la copiaFile
  22.                 label1.Refresh();
  23.                 progressBar1.Refresh();
  24.                 //this.Refresh(); non serve.
  25.             }
  26.             label1.Text = "COMPLETE";
  27.            
  28.             }));
  29.        
  30.         }



Separa la funzione che mostra il progresso con l'apertura del form.
questo può causare proprio blocchi di questo genere.
Poi ti consiglio quando si tratta di effettuare operazioni che richiede un tot di tempo, o come in questo caso, di separare sempre il tutto in un Thread diverso da quello principale.
così ne guadagni in prestazioni e velocità.
proprio come diceva carlo

Testo quotato


metodo asincrono



Ultima modifica effettuata da Thejuster il 11/10/2020 alle 12:47


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
fosforo (Normal User)
Expert


Messaggi: 391
Iscritto: 06/04/2009

Segnala al moderatore
Postato alle 8:42
Martedì, 13/10/2020
Ciao

Grazie per le risposte, sempre preziose.
Con il vostro aiuto ho risolto ma devo ammettere che non è tutto chiaro.
Devo studiare.
Ho trovato molto interessante l'argomento delle operazioni Sincrone e Asincrone, di cui non so praticamente nulla.
Dove potrei trovare materiale per approfondire?


Grazie per l'aiuto.

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 10:42
Martedì, 13/10/2020
con backgroundworker:
https://docs.microsoft.com/en-us/dotnet/api/system.componen ...
con async:
https://docs.microsoft.com/it-it/dotnet/csharp/programming- ...
Nelle MSDN ci sono altri articoli ed esempi, per le ricerche usa:
backgroundworker
async
await

Per copiare i file, dopo che hai letto le MSDN, guarda questo:
https://stackoverflow.com/questions/6044629/file-copy-with- ...

Ultima modifica effettuata da Carlo il 13/10/2020 alle 11:44


in programmazione tutto è permesso
PM Quote
Avatar
fosforo (Normal User)
Expert


Messaggi: 391
Iscritto: 06/04/2009

Segnala al moderatore
Postato alle 8:25
Venerdì, 16/10/2020
Grazie Carlo :k::k:

PM Quote