[Vb.net 2005] Gestire i tempi di attesa di un elaborazione

venerdì 11 luglio 2008 - 21.35

seven.7 Profilo | Junior Member

Ho creato un programma che legge dei file di testo e carica tutti i listini in un datagridview, il programma funziona correttamente ma poichè i dati da caricare sono tanti succede che per quella frazione di secondi il programma pare come si impallasse (non si vedono le icone ecc...) ma non è così perchè dopo aver terminato la lettura di tutti i file il programma funziona bene. Adesso la mia domanda per una questione di eleganza diciamo come posso creare una sorta di progress bar per le operazioni che richiedono più tempo senza avere quella fastidiosa sensazione di impallo? thanks

luigidibiasi Profilo | Guru

Ciao, ti posso suggerire due strade...

Soluzione frettolosa:
Se usi un ciclo per caricare la griglia (immagino di sì perchè dici di caricare da un file i dati) ad ogni passo puoi lanciare progressBar.Refresh() oppure Application.doEvents().
Nel primo caso ti si aggiorna solo la progressbar ma dai un senso di "elaborazione" al tutto.
Se usi doEvents invece, ad ogni passo quando viene raggiunta l'istruzione DoEvents() il programma si sblocca ed elabora tutti i messaggi in sospeso quindi ridisegna la finestra e non ti lascia tutto bianco e bloccato. (chiaramente tra un doEvents e l'altro si blocca comunque ma non dovrebbe notarsi).

Soluzione più accurata:
L'ideale sarebbe caricarti i dati con un thread separato in modo tale da non bloccare l'applicazione.
Mostri la progressbar quando avii il thread, la fai muovere come meglio credi e al termine del thread la nascondi. Probabilmente la prima soluzione è più immediata e in questo caso anche se non proprio fine dovrebbe essere ok.



Luigi Di Biasi

seven.7 Profilo | Junior Member

mi spiegheresti meglio come fare? o dove trovare un piccolo tutorial perchè sono autodidatta e questo thread non mi dice niente purtroppo... :-( perdonami...

luigidibiasi Profilo | Guru

ok... allora.. inserisci una progressbar nel form di caricamento dei dati.. ipotizzo che questa progressbar abbia nome progressbar1...

Ipotizziamo poi che questo sia il ciclo che usi per caricarti i dati:


while(.....)

// qui c'è il codice che usi per leggere la riga dal file di testo
// qui c'è il codice che usi per inserire i dati nell gridview

// questo codice fa muovere la progressbar (incrementa di 1 il valore)
if progressBar1.value + 2 > progressBar1.maximun then
progressBar1.value = progresbar1.minimun
end if
progressBar1.value = progressBar1.value + 1
application.doEvents() // qui ti sblocca l'applicazione ridisegnando la finestra.

loop

Questo è solo un esempio che và raffinato
Se mi posti il codice che utilizzi per leggere i dati e riempire la griglia viene meglio.
Luigi Di Biasi

rossimarko Profilo | Guru

>Ho creato un programma che legge dei file di testo e carica tutti
>i listini in un datagridview, il programma funziona correttamente
>ma poichè i dati da caricare sono tanti succede che per quella
>frazione di secondi il programma pare come si impallasse (non
>si vedono le icone ecc...) ma non è così perchè dopo aver terminato
>la lettura di tutti i file il programma funziona bene. Adesso
>la mia domanda per una questione di eleganza diciamo come posso
>creare una sorta di progress bar per le operazioni che richiedono
>più tempo senza avere quella fastidiosa sensazione di impallo?
>thanks

Ciao,

nel framework 2.0 hanno inserito un controllo BackgroundWorker (http://msdn.microsoft.com/it-it/library/8xs8549b.aspx) che ti consente di automatizzare le esecuzioni asincrone. Potresti sfruttarlo per fare il caricamento in modo tale da non bloccare la form. Ti consente di gestire anche un evento di ProgressChanged per aggiornare la progress bar.

Qui trovi un esempio: http://msdn.microsoft.com/it-it/library/system.componentmodel.backgroundworker.aspx

-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5