C# - Strano comportamento programma che usa ListView

venerdì 26 ottobre 2012 - 08.17
Tag Elenco Tags  C#  |  .NET 3.5  |  Windows 7

pixelpix Profilo | Newbie

Il software che sto sviluppando in C# utilizzando SharpDevelop si comporta in un modo stranissimo. Cercherò di descriverlo brevemente anche se non sarà facile.
Ho una finestra in cui ho tre ListView. Cliccando su un pulsante, con un ciclo for riempo queste tre ListView con semplici stringhe di testo che arrivano da una List già popolata. Il riempimento e la visualizzazione non è immediata. Infatti io voglio che ogni riga venga visualizzata ogni tot millisecondi e per questo utilizzo la funzione System.Threading.Thread.Sleep.
Ebbene, quando eseguo il software facendolo partire all'interno dell'ambiente di sviluppo questo si comporta come voglio io senza alcun problema, mentre quando eseguo il software al di fuori, semplicemente facendo doppio click sull'eseguibile, quando premo il pulsante per far popolare e visualizzare il contenuto delle ListView, succede una cosa strana, ovvero le ListView cominciano a popolarsi e le righe compaiono a schermo secondo il ritardo da me impostato, poi ad un certo punto non definito il programma sembra come che si impalli... nelle listview non compare più nulla e l'unica cosa che vedo è il cursore del mouse che cambia facendomi capire che il programma sta lavorando. In effetti il programma non si è impallato, sta continuando ad eseguire le istruzioni e solo quando arriva al termine del ciclo for ritorna disponibile e come risultato ho le listview piene con tutte le stringhe. Il problema è che, per esempio, dalla stringa 10 alla 200 non le ho viste comparire sullo schermo come avrei voluto. Quale può essere la spiegazione di questo strano comportamento? Qualcuno ha qualche idea su come risolverlo?
Grazie

Vinsent Profilo | Senior Member

Il problema stà nell' utilizzo dello sleep come "pausa". Se lo usi nel thread della form questa risulta bloccata per ogni intervallo dichiarato, inoltre a seconda delle prestazioni del pc la grafica può rimanere "indietro"...non so come spiegarlo meglio...comunque, per risolvere devi inserire una riga di codice: 'Application.DoEvents();', vedi qui:
http://msdn.microsoft.com/it-it/library/system.windows.forms.application.doevents(v=vs.90).aspx#Y0
in modo che il programma "smaltisca" tutte le operazioni prima di continuare con il ciclo e la visualizzazione scorra come vuoi tu, comunque ti rimane il discorso del blocco della form, se gli sleep sono brevi e l' elaborazione è breve può anche andare bene...devi valutare tu.
Un metodo più consono, per non bloccare la form ed evitare problemi di visualizzazione, sarebbe quello di usare un Timer o ancora meglio un backgroundworker o thread separato che aggiorna i controlli della form tramite un delegato.
Ciao

pixelpix Profilo | Newbie

Grazie mille per il suggerimento.
In effetti sospettavo anche io che la funzione Sleep avesse a che fare con il problema.
Ad ogni modo utilizzando Application.Doevents ho risolto tutti i problemi.
Quindi penso che non devo mettermi, almeno per ora, a studiare e capire cosa sono i backgroundworker e come usarli.
Grazie di tutto.
Ciao
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5