Problema con un form

mercoledì 31 gennaio 2007 - 20.00

roccomita Profilo | Newbie

Salve a tutti!
Avrei un problema.
ho un form con una progress bar e un pulsante.
Cliccando sul pulsante la mia applicazione esegue il metodo click che esegue delle operazioni per circa 10 secondi. Intanto il form mi rimane bloccato e pur impostando come prima istruzione del metodo click lo style della progressbar a marquee gli effetti si vedono solo dopo i 10 secondi.
Come posso fare affinchè, premendo il pulsante, lo stile della progressbar si imposti a marquee già dal primo secondo?

Grazie

alextyx Profilo | Expert

Non sono sicuro che funzioni, però proverei con un 'refresh' della progress bar, dopo averla impostata con lo stile che desideri.

us01739 Profilo | Expert

Nelle operazioni che esegui per 10 sec. hai per caso un ciclo?
Se sì, ti consiglio di inserirci un refresh dentro.

Bye Bye

---------------------------------------------------
Roberto Gelmini - Microsoft Certified Professional
www.robertogelmini.com
---------------------------------------------------

freeteo Profilo | Guru

ciao,
perche' non provi ad usare un Thread?
Ovvero fai partire l'operazione da 10sec con un processo (thread appunto) separato dalla form, in modo che l'utente vede la progress che avanza, ma intanto puo' interagire con il resto della form (magari al lancio del thread disabilita i pulsanti che possono farti far casino cn l'utente idiota che clicca "n volte" e fa casino lanciando "n thread").

Nel tuo caso io userei un codice tipo:
... private void button1_Click(object sender, EventArgs e) { progressBar1.Maximum = 100000; Thread t = new Thread(miafunzioneLunga); t.Priority = ThreadPriority.Lowest; t.Start(); } private void miafunzioneLunga() { progressBar1.Value = 0; for (int i = 0; i < 100000; i++) { progressBar1.Invoke(new MethodInvoker( delegate() { progressBar1.Value = i; } )); } } ....

praticamente al Thread gli dici di eseguire quella funzione e nella funzione gli dici alla progressbar di andare a modificarsi il valore con Invoke+Methoinvoker+AnonymousMethod , per evitare il problema di CrossThreading.
Lo so, il codice sembra incasinato ma se fai una form con dei controlli tipo TextBox e ci metti quel codice, vedi che non si blocca il funzionamento, e la progressbar lavora in background.

A proposito di BackGround, esiste un componente che ti aiuta in questo tipo di operazioni, il BackGroundWorker.Ti do il link di msdn, se vuoi usare quella strada (analoga alla mia):
http://msdn2.microsoft.com/it-it/library/8xs8549b(VS.80).aspx
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

roccomita Profilo | Newbie

Ho provato con il refresh della form a ogni iterazione del ciclo di 10 secondi e diciamo che ho risolto il problema.

Poi sn curioso di provare il metodo alternativo proposto da freeteo.
vi farò sapere....

Vi ringrazio siete grandi!!!!!
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5