Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    [vb.net-c#-framework 3.5-4] aggiornare una label in un ciclo lungo

    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

  2. #2
    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.


  3. #3
    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.
    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.
    Qui un articolo in proposito.
    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.
    Buona la seconda.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Originariamente inviato da MItaly
    Buona la seconda.
    In particolare, tu, cosa useresti?

  5. #5
    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.

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    :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

  7. #7
    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?

  8. #8
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.