Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [VB.NET] Thread e ProgressBar ...errore...!!!

    Ho una ProgressBar creata nel Form1 di un progetto,
    all'apertura del Form1 apro un nuovo Thread,
    il nuovo Thread Popola la ProgressBar,
    ma chiaramente mi da errore perche la ProgressBar appartiene al Form1 e non al nuovo Thread,
    come posso fare per fare funzionare la ProgressBar dal nuovo Thread ???

  2. #2
    Che errore ti dà esattamente? Non mi pare che esistano limitazioni di questo genere...
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Mi da questo errore:
    ------------------------------------------------------------------
    Cross-thread operation not valid: Control 'pbCollezioni' accessed from a thread other than the thread it was created on.

  4. #4
    Si tratta di un'innovazione del .NET Framework 2.0: poiché si sono resi conto che i controlli effettivamente non sono thread-safe hanno aggiunto questo meccanismo di protezione. L'unica è modificare il codice in modo che sia sempre il thread padre ad accedere ai controlli.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Ma io ho la necessita' di comandare i Controlli dal mio Thread!!!

    il Thread Padre apre il Form1 e Crea la ProgressBar, il mio Thread la popola, altrimenti non mi si aprirebbe il Form1 fino a che non e' popolata la ProgressBar!!!

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    Originariamente inviato da MItaly
    Si tratta di un'innovazione del .NET Framework 2.0: poiché si sono resi conto che i controlli effettivamente non sono thread-safe hanno aggiunto questo meccanismo di protezione. L'unica è modificare il codice in modo che sia sempre il thread padre ad accedere ai controlli.
    I controlli non sono mai stati thread safe... vuoi dirmi che nella versione 1.1 non c'era alcuna protezione o precisazione a riguardo? VVoVe:

    Originariamente inviato da w_t
    Ma io ho la necessita' di comandare i Controlli dal mio Thread!!!
    il Thread Padre apre il Form1 e Crea la ProgressBar, il mio Thread la popola, altrimenti non mi si aprirebbe il Form1 fino a che non e' popolata la ProgressBar!!!
    Non penso che ci sia bisogno di "esclamare". La tua soluzione non è appropriata e non sicura, pertanto continuando per quella strada arrivi ad un vicolo cieco, e qualsiasi urlo tu possa fare, non farà cadere il muro.

    Peraltro, io suggerirei una soluzione molto più pulita: se il thread compie operazioni parallele, non dovrebbe essere lui ad aggiornare il controllo visuale, che si sincronizza con il thread primario, ma si deve dedicare esclusivamente al compito che gli è stato assegnato.

    Semplicemente, introduci nel thread una proprietà che indichi il progresso dell'operazione e, dal form contenente la ProgressBar, magari con un semplice Timer, periodicamente leggi questo valore (quindi, con un'operazione del tutto innocua verso il thread) e aggiorna la ProgressBar.

    In sostanza, il thread compie il lavoro e restituisce informazioni sullo stato, il form periodicamente legge questo valore in modo asincrono e aggiorna il controllo visuale.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Io di solito per aggiornare da un thread secondario controlli nel thread principale,uso i delegate e funziona perfettamente.

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    Originariamente inviato da cassano
    Io di solito per aggiornare da un thread secondario controlli nel thread principale,uso i delegate e funziona perfettamente.
    Se non c'è un meccanismo di sincronizzazione, corri lo stesso rischio di accedere in modo asincrono al controllo visuale "provocando danni".

    Chiamare un delegate è un modo diverso di invocare un metodo, ma il concetto è lo stesso.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Originariamente inviato da alka
    I controlli non sono mai stati thread safe... vuoi dirmi che nella versione 1.1 non c'era alcuna protezione o precisazione a riguardo? VVoVe:
    Vero, i controlli non sono mai stati thread-safe (basta controllare nell'SDK del .NET Framework 1.1), ma non c'è mai stato un controllo sulla validità di operazioni tra thread prima della versione 2.0 del .NET Framework. Si può sopprimere questo controllo inserendo la seguente istruzione:
    codice:
    Control.CheckForIllegalCrossThreadCalls = False
    .
    Tuttavia ti sconsiglio fortemente di farlo, perché spesso eseguendo operazioni da un thread diverso su oggetti non thread-safe si possono ottenere strani risultati (molto banalmente, se è stato inserito questo controllo ci sarà un motivo... ).
    La soluzione più elegante al tuo problema resta quella di alka, anche se puoi invece inserire il tuo metodo da eseguire in parallelo in una classe componente (da inserire nel form) che presenta un evento ogni volta che è stato eseguito l'x percento dell'operazione; il form intercetta questo evento e aggiorna la progressbar di conseguenza.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Originariamente inviato da alka
    Semplicemente, introduci nel thread una proprietà che indichi il progresso dell'operazione e, dal form contenente la ProgressBar, magari con un semplice Timer, periodicamente leggi questo valore (quindi, con un'operazione del tutto innocua verso il thread) e aggiorna la ProgressBar.

    In sostanza, il thread compie il lavoro e restituisce informazioni sullo stato, il form periodicamente legge questo valore in modo asincrono e aggiorna il controllo visuale.
    Scusami, credo di non avere ben capito il det6taglio,

    La "progressBar" si trova su "Form1" ed e' incrementata da un "FOR EACH"

    il mio problema e' che il Form1 non si apre se non dopo che il "FOR EACH" si e' concluso,

    mentre io voglio prima aprire il Form1 e poi deve iniziare il "FOR EACH" della "ProgressBar" in modo da vederla avanzare.

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.