Torna indietro   Hardware Upgrade Forum > Software > Programmazione

realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
Hogwarts arriva in fascia media grazie a realme, con una special edition che unisce la Quadra Light-Sensing Color-changing Tech, un baule in stile Hogwarts Express pieno di collezionabili e una scheda tecnica sostanzialmente identica al 16 Pro di partenza: ecco cosa cambia davvero, come si comporta nell'uso quotidiano e quanto vale in base al prezzo di 699,99 euro
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-05-2009, 16:23   #1
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2009, 17:16   #2
Energy++
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 1060
BackgroundWorker
Energy++ è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2009, 23:25   #3
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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;
        }
    }
Questo esempio mi funziona considerando però che nel metodo LoadData() io sappia cosa caricare...

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 00:37.
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2009, 11:35   #4
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
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.
Non so se lo hai già considerato, ma un metodo semplice per non dover usare altri Thread, BackgroundWorker ecc... potrebbe essere quello di usare la FormWait stessa per fare il lavoro... :

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.
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2009, 15:52   #5
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
Non so se lo hai già considerato, ma un metodo semplice per non dover usare altri Thread, BackgroundWorker ecc... potrebbe essere quello di usare la FormWait stessa per fare il lavoro... :

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 ).
Ti confesso che la mia idea iniziale era proprio questa

Quote:
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.
Più che trattarsi di sapere in anticipo, mi basterebbe che contasse 'a video' (mediante appunto una progress bar) quanto tempo impiega a completare l'operazione.

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
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2009, 16:49   #6
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
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
Oddio, proprio "impegnare piacevolmente" è un tantino forte, come affermazione...
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 16:51.
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2009, 16:59   #7
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
Oddio, proprio "impegnare piacevolmente" è un tantino forte, come affermazione...
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...
Mm.. mi sai che hai ragione tu.

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
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2009, 17:08   #8
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Mm.. mi sai che hai ragione tu.

Per me il discorso non cambia di una virgola però

Non ho idea di come allacciare una progress bar a questi cicli
All'inizio hai parlato di Form d'attesa su operazioni di lettura / inserimento a DB, quindi in entrambi i casi puoi conoscere a priori il numero di record che vai a leggere / scrivere... Quel numero sarà il max della tua progressbar. Ad ogni ciclo incrementi di 1. Fai un conto del tempo trascorso ogni N cicli, e in base a quello e al numero di cicli previsti calcoli il tempo rimanente stimato... Io spesso ho risolto così.
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2009, 17:27   #9
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2009, 17:46   #10
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Vediamo se ho compreso

Codice:
IList miaLista = someLista;

progressBar.Maximum = miaLista.Count;

for(int i = 0; i < miaLista.Count; i++)
{

     progressBar.Value = i;
}
??
Ok, esempio ( banale ) di filling di una List :

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);
            }
La Sleep solo per apprezzare con una certa "lentezza" l'avanzamento.
Anche il tuo esempio è ok. Insomma, il concetto è quello.
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 31-05-2009, 20:04   #11
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
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();
            }
lbl_ sono Label.
Ovvio che si può alleggerire facendo tale calcolo ogni N cicli a piacere...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole! realme 16 Pro Harry Potter Edition: il nuovo mid...
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Big Fish, in Sicilia il più grand...
Dongfeng mostra la piattaforma T1 in Eur...
Centinaia di vittime per aver scaricato ...
File di Excel illeggibili su LibreOffice...
Grok 4.7 raddoppia la velocità e dimezza...
Sembra uscito da Halo ma è un cas...
Fable 2 su PC a 60 FPS: il port non uffi...
Amazfit T-Rex Dual Solar: ecco il nuovo ...
Fermati 45 maxi-progetti IA negli USA. T...
Niente datacenter a Turbigo: il sindaco ...
OPPO Creator Academy, al via il progetto...
Un annuncio di lavoro, un file da scaric...
Tim Cook riceverà il Robert N. No...
Meta ha annunciato Petal, il primo cavo ...
Resident Evil Veronica, l'uscita potrebb...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:24.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v