Dentro un form eseguo un ciclo abbastanza lungo (in termini di tempo)
Vorrei che si visualizzasse in una label il contatore del ciclo. :master:
ps. se volessi mettere un pulsante per interrompere il ciclo, come dovrei fare? :master:
ciao![]()
Dentro un form eseguo un ciclo abbastanza lungo (in termini di tempo)
Vorrei che si visualizzasse in una label il contatore del ciclo. :master:
ps. se volessi mettere un pulsante per interrompere il ciclo, come dovrei fare? :master:
ciao![]()
Pietro
Fai eseguire il lavoro dispendioso ad un altro thread. Se vuoi stampare l'indice del ciclo, banalmente, agisci sulla proprietà Text della label.
Per fermare l'elaborazione, semplicemente aggiungi un pulsante al form, crei un delegato e lo aggiungi agli eventi del click del mouse sul pulsante.
In questo delegato fai il necessario. Banalmente, puoi killare il thread. Ovviamente, però, ti conviene sincronizzare il tutto, dunque devi studiare i metodi di sincronizzazione tra thread nell'ambiente .NET.
![]()
Non è così semplice; i controlli Windows Forms non sono thread safe, per cui dovrai usare il metodo Invoke del controllo per richiamare un'altra funzione che si occuperà di aggiornare la label nell'ambito del thread GUI principale.Originariamente inviato da antotan
Fai eseguire il lavoro dispendioso ad un altro thread. Se vuoi stampare l'indice del ciclo, banalmente, agisci sulla proprietà Text della label.
Qui un articolo in proposito.
Buona la seconda.In questo delegato fai il necessario. Banalmente, puoi killare il thread. Ovviamente, però, ti conviene sincronizzare il tutto, dunque devi studiare i metodi di sincronizzazione tra thread nell'ambiente .NET.![]()
Amaro C++, il gusto pieno dell'undefined behavior.
In particolare, tu, cosa useresti?Originariamente inviato da MItaly
Buona la seconda.![]()
In generale userei la classe Interlocked; in particolare, però, si potrebbe semplicemente usare un campo ti tipo Bool impostato come volatile, la cui lettura/scrittura dovrebbe essere atomica su qualunque piattaforma. Alla partenza del ciclo, tale variabile è impostata a False; ad ogni iterazione del ciclo viene controllato il valore in questione; se fosse True, il codice termina il ciclo e quindi il thread. Il pulsante "Annulla" semplicemente imposterebbe il campo in questione a True, condizione sufficiente per far terminare in maniera "pulita" il thread.
Amaro C++, il gusto pieno dell'undefined behavior.
:master: ho fatto un po' di memoria ed ho fatto così:
alla fine del ciclo for metto
Application.DoEvents()
If Me.interrompi Then Exit For
dov interrompi è un booleano messo a true da un pulsante
Questo basta, sia per aggiornare la label, sia per aggiornare il progressbar della pagina
A me sembra che vada benissimo :master:![]()
Ciao![]()
Pietro
Originariamente inviato da MItaly
In generale userei la classe Interlocked; in particolare, però, si potrebbe semplicemente usare un campo ti tipo Bool impostato come volatile, la cui lettura/scrittura dovrebbe essere atomica su qualunque piattaforma. Alla partenza del ciclo, tale variabile è impostata a False; ad ogni iterazione del ciclo viene controllato il valore in questione; se fosse True, il codice termina il ciclo e quindi il thread. Il pulsante "Annulla" semplicemente imposterebbe il campo in questione a True, condizione sufficiente per far terminare in maniera "pulita" il thread.
Se volessimo applicare questa logica utilizzando, ad esempio, un campo intero (diciamo "stop") e la classe Interlocked, cambierebbe solo che vari settaggi del campo avverrebbero con la Exchange, così come il get&set (se è avviato, fermalo) fatto dal delegato del pulsante "Annulla".
Il controllo fatto dal thread all'interno del ciclo rimarrebbe qualcosa come "if (stop == 1)...", giusto?
Be', nel ciclo ci metterei una Read, e in Annulla una Increment o una Exchange.
D'altra parte in effetti in questo caso come in molti altri l'Interlocked è eccessiva, visto che un thread deve solo leggere e l'altro solo scrivere, e qualunque tipo di dato primitivo (tranne Int64 su x86) consente letture e scritture atomiche.
Amaro C++, il gusto pieno dell'undefined behavior.