Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126

    [c#] Update text di un controllo label che non avviene

    non riesco a capire perchè non riesco a vedere l'aggiornamento in tempo reale del testo di un controllo label..
    ad esempio, voglio visualizzare i numeri che vanno da 0 a 5000 in un controllo label, dopo la pressione si un pulsante, quindi nell'evento Click di questo pulsante:
    codice:
    for(int i=0; i<5000; i++){
    label.text = i.ToString();
    }
    il numero 4999 lo visualizzo, ma solo alla fine del ciclo e non progressivamente.
    Se provo a mettere questo codice in un thread separato allora riesco a visualizzare l'aggiornamento della proprietà text in tempo reale, anche se in alcuni casi neanche l'utilizzo di un altro thread mi viene in aiuto.. qualche idea? è già capitato a qualcuno? come l'avete risolto?

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    La spiegazione è molto semplice: l'avvio dell'elaborazione che modifica la proprietà Text del controllo Label avviene probabilmente alla generazione di un evento nell'applicazione, che corrisponde ad un determinato messaggio inserito nella coda dell'applicazione da Windows; fino a quando l'elaborazione non termina, l'applicazione non è in grado di gestire i messaggi successivi, tra cui molto probabilmente sono presenti quelli volti ad eseguire il "refresh" del controllo Label.

    La stessa cosa vale anche per altri tipi di controlli, come la ProgressBar, ad esempio.

    La soluzione al problema è quella di adoperare un thread esterno che esegua l'elaborazione, lasciando così il thread primario dell'applicazione libero di processare i messaggi in arrivo ed aggiornare i controlli visuali.

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

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

  3. #3
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    Originariamente inviato da alka
    La spiegazione è molto semplice: l'avvio dell'elaborazione che modifica la proprietà Text del controllo Label avviene probabilmente alla generazione di un evento nell'applicazione, che corrisponde ad un determinato messaggio inserito nella coda dell'applicazione da Windows; fino a quando l'elaborazione non termina, l'applicazione non è in grado di gestire i messaggi successivi, tra cui molto probabilmente sono presenti quelli volti ad eseguire il "refresh" del controllo Label.

    La stessa cosa vale anche per altri tipi di controlli, come la ProgressBar, ad esempio.

    La soluzione al problema è quella di adoperare un thread esterno che esegua l'elaborazione, lasciando così il thread primario dell'applicazione libero di processare i messaggi in arrivo ed aggiornare i controlli visuali.

    Ciao!
    bhè si è sicuramente così, anche perchè l'ho sperimentato come dici tu su altri controlli.. cmq con la versione 2 del framework .net le cose si complicano ancora in quanto pur volendo "bindare" il controllo label da un thread separato, si presenta l'eccezione, che prima non veniva manco considerata e secondo me era molto meglio, la quale indica che l'accesso ad un controllo creato in un thread non uguale a quello in cui si cerca di popolare la label, non è consentito. Microsoft mette anche a disposizione un bel "CheckForIllegalCrossThreadCalls" che sinceramente non capisco a questo punto a cosa server.. insomma non capisco se è un problema di sicurezza che microsoft affronta in quanto se ne lava le mani facendo venire fuori questa eccezione in fase di debug ma cmq dando la possibiltà di accedere al thread separato in modo non sicuro..
    Voglio dire:
    O mi dici che bisogna accedere in thread-safe o no.. non si può aggirare qualcosa che hai inventato tu, è abbastanza paradossale non credi?

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Non ho potuto sperimentare l'eccezione a cui fai riferimento, ad ogni modo anche in altri linguaggi non è possibile accedere "gratuitamente" ad un'istanza di un controllo visuale da un thread esterno quando questa è stata creata (e viene anche gestita) da un altro thread, poiché entrambi agiscono in concorrenza su una risorsa condivisa.

    Che venga segnalato come errore oppure no, si tratta di una pratica da evitare.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  5. #5
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    Originariamente inviato da alka
    Non ho potuto sperimentare l'eccezione a cui fai riferimento, ad ogni modo anche in altri linguaggi non è possibile accedere "gratuitamente" ad un'istanza di un controllo visuale da un thread esterno quando questa è stata creata (e viene anche gestita) da un altro thread, poiché entrambi agiscono in concorrenza su una risorsa condivisa.

    Che venga segnalato come errore oppure no, si tratta di una pratica da evitare.
    eh ma allora non c'è modo di comunicare tra thread e controlli di altri thread ?

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da dops
    eh ma allora non c'è modo di comunicare tra thread e controlli di altri thread ?
    Purtroppo non ho ancora avuto l'occasione di sperimentare il multithreading con .NET, ma solo con altri linguaggi, quindi non so darti risposte più precise.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  7. #7
    Hai provato cosi' ...

    codice:
    			for(int i=0; i<5000; i++)
    			{
    				label.Text = i.ToString();
    				Application.DoEvents(); 
    			}


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.