|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[C#/Net 2.0]Usare Thread
Ciao a tutti
Vorrei provare a realizzare il classico "form" di attesa mentre viene compiuta un'operazione di lettura/scrittura su un database. Avreste qualche link dal quale potrei iniziare a documentarmi? Grazie mille RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 1059
|
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Ho dato uno sguardo al BackGroundWorker ma forse non fa al caso mio oppure (molto più probabilmente) non ho capito come funziona.
Il fatto è che io non vorrei legarmi al form o al database ma costruire un 'FormWait' da poter utilizzare anche in altri progetti. Seguendo un esempio trovato in rete 'for dummies' : Codice:
public class TestThreads
{
private const string loadingMessage = "Caricamento... attendere..:";
private const string doneLoadingMessage = "Caricamento finito";
private System.Windows.Forms.Label loadingLabel;
private Thread loadingThread;
private delegate void Loader();
public TestThreads(System.Windows.Forms.Label loadingLabel)
{
this.loadingLabel = loadingLabel;
loadingThread = new Thread(LoadData);
}
public void TestLoad()
{
loadingLabel.Text = loadingMessage;
loadingThread.Start();
}
private void LoadData()
{
IList my list = someListInCaricamento...;
if (loadingLabel.InvokeRequired)
loadingLabel.Invoke(new Loader(CompleteLoad));
else
CompleteLoad();
}
private void CompleteLoad()
{
loadingLabel.Text = doneLoadingMessage;
}
}
Quello che invece cerco di capire è come passare un qualsiasi altro metodo proveniente da un'altra classe senza che io debba necessariamente conoscere o sapere quello che fa. grazie mille RaouL. P.S.: Ho letto inoltre che con un backgroundworker si incappa, quando si ha a che fare con le UI, in eccezioni di tipo Cross-Thread operation not valid perchè è proibito ogni accesso alla UI dai threads generati dal backgroundworker.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
Ultima modifica di RaouL_BennetH : 31-05-2009 alle 01:37. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
1. Pulsante sulla Form1 > "Fai il lavoro". > Non fa il lavoro, ma apre la FormWait, e chiama una Public Void LanciaMetodo() sulla stessa, che a sua volta lancia il metodo desiderato da altra classe ecc... 2. Dal momento che quel metodo è bloccante, alla fine dello stesso si può decidere se chiudere direttamente la FormWait o far apparire messaggi di "processo completato" e lasciare all'utente la chiusura. 3. In questo caso la FormWait è sempre quella, dovrai solo modificare una riga di codice ( la chiamata al metodo contenuta nella Public Void LanciaMetodo() ). In ogni caso FormWait deve sapere il metodo da lanciare, anche su usi altre tecniche più "complicate". Puoi aggiungere una progressbar generica ( Style = Marquee ). Ovvio che se il senso della tua richiesta era una FormWait generica che sappia in anticipo il tempo impiegato da un qualsiasi metodo e mi informi del suo avanzamento... Le cose si fanno più difficili.
|
|
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Quote:
In sostanza, in molti programmi vedo che quando ci sono operazioni di connessione ad un db (magari remoto), inserimenti, caricamento di liste varie, c'è sempre un formettino a parte o qualche altra diavoleria che impegna piacevolmente il tempo dell'utente nel frattempo che l'operazione si concluda. Non avevo idea che fosse una cosa così complessa da realizzare
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
||
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Scherzi a parte, no, non è una cosa affatto difficile. Solo, secondo me, stai tentando la strada più incasinata tra quelle disponibili. Solitamente queste operazioni sono cicli ( ciclo di un DataReader, ciclo di un Command che fa più Insert, o più Update, ciclo che popola liste ecc... ) perciò una progressbar allacciata al ciclo è cosa semplice ( anche aggiungendo un calcolo su "tempo impiegato" e "tempo rimanente"... ). Ma una form di attesa che, qualsiasi metodo le si passi, mostra il progresso... Beh, a sto punto son curioso anch'io... Ultima modifica di MarcoGG : 31-05-2009 alle 17:51. |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Per me il discorso non cambia di una virgola però Non ho idea di come allacciare una progress bar a questi cicli
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Vediamo se ho compreso
Codice:
IList miaLista = someLista;
progressBar.Maximum = miaLista.Count;
for(int i = 0; i < miaLista.Count; i++)
{
progressBar.Value = i;
}
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Codice:
int numElementi = 100;
progressBar1.Maximum = numElementi;
progressBar1.Value = progressBar1.Minimum;
List<string> Lista = new List<string>();
for (int i = 0; i < numElementi; i++)
{
Lista.Add("Stringa_" + i.ToString());
progressBar1.Value = i;
System.Threading.Thread.Sleep(10);
}
Anche il tuo esempio è ok. Insomma, il concetto è quello. |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
... E questo invece un'esempio di quanto dicevo sui Tempi Stimati del ciclo :
Codice:
DateTime tInizio = DateTime.Now;
TimeSpan tsTrascorso = TimeSpan.Zero;
TimeSpan tsTotale = TimeSpan.Zero;
TimeSpan tsRimanente = TimeSpan.Zero;
int numElementi = 1000;
progressBar1.Maximum = numElementi;
progressBar1.Value = progressBar1.Minimum;
List<string> Lista = new List<string>();
for (int i = 1; i <= numElementi; i++)
{
Lista.Add("Stringa_" + i.ToString());
progressBar1.Value = i;
System.Threading.Thread.Sleep(80);
tsTrascorso = DateTime.Now - tInizio;
tsTotale = TimeSpan.FromSeconds(tsTrascorso.TotalSeconds * numElementi / i);
tsRimanente = tsTotale - tsTrascorso;
lbl_ttotale.Text = "Tempo Totale Stimato = " + tsTotale.Minutes + " Min., " + tsTotale.Seconds + " Sec.";
lbl_ttrascorso.Text = "Tempo Trascorso = " + tsTrascorso.Minutes + " Min., " + tsTrascorso.Seconds + " Sec.";
lbl_trimanente.Text = "Tempo Rimanente Stimato = " + tsRimanente.Minutes + " Min., " + tsRimanente.Seconds + " Sec.";
Application.DoEvents();
}
Ovvio che si può alleggerire facendo tale calcolo ogni N cicli a piacere... |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:12.




















