2010-10-18 13 views
5

Hey, ho una sequenza di codice che va qualcosa come questo:GUI non aggiornare fino a quando il codice è finito

label.Text = "update 0"; 
doWork(); 
label.Text = "update 1"; 
doWork2(); 
label.Text = "update 2"; 

In sostanza, l'interfaccia grafica non aggiorna a tutti, fino a quando tutto il codice è fatto esecuzione. Come superare questo?

risposta

16

Un brutto trucco è utilizzare Application.DoEvents. Mentre funziona, consiglierei di non farlo.

Una soluzione migliore consiste nell'utilizzare un BackgroundWorker o un thread separato per eseguire attività a esecuzione prolungata. Non utilizzare il thread della GUI perché questo causerà il blocco.

Una cosa importante da tenere presente è che le modifiche alla GUI devono essere apportate sul thread della GUI, quindi è necessario trasferire il controllo al thread della GUI per gli aggiornamenti delle etichette. Questo viene fatto usando Invoke. Se si utilizza un BackgroundWorker è possibile utilizzare ReportProgress - questo gestirà automaticamente la chiamata di Invoke per conto dell'utente.

+3

Dettagli sulla [classe in background] (http: // bit.ly/a9VgVn) e un [esempio di come usarlo] (http://bit.ly/ailRTF) – codingbadger

0

Attualmente, tutta l'elaborazione viene eseguita sul thread principale (UI), quindi tutta l'elaborazione deve essere completata prima che il thread dell'interfaccia utente abbia cicli liberi per ridisegnare l'interfaccia utente.

Hai 2 modi per superare questo. Il primo modo, che non è raccomandato, è quello di utilizzare
Application.DoEvents(); Eseguirlo quando si desidera che la coda dei messaggi di Windows venga elaborata.

L'altro, consigliato, modo: creare un altro thread per eseguire l'elaborazione e utilizzare un delegato per passare gli aggiornamenti dell'interfaccia utente al thread dell'interfaccia utente. Se sei nuovo nello sviluppo multithread, prova a provare a BackgroundWorker.

2

L'interfaccia utente si aggiorna quando viene visualizzato il messaggio WM_PAINT per ridisegnare lo schermo. Se si sta eseguendo il codice, la routine di gestione dei messaggi non viene eseguita.

modo da poter fare quanto segue per abilitare l'esecuzione del gestore di messaggi:

Il Application.DoEvents, chiama il gestore di messaggi, e poi ritorna. Non è l'ideale per i lavori di grandi dimensioni, ma per una piccola procedura, può essere una soluzione molto più semplice, invece di introdurre la filettatura.

0

GUI non può essere aggiornato durante l'esecuzione del codice in questo modo. La GUI su Windows dipende dall'elaborazione dei messaggi e l'elaborazione dei messaggi viene interrotta mentre si è nel codice: indipendentemente da ciò che si fa con le etichette, i pulsanti e così via, verranno tutti aggiornati DOPO che il codice viene chiuso e il ciclo di messa in onda principale del modulo è trasformati.

Sono disponibili diverse opzioni qui: elaborazione

  • mossa per altro thread e faccia Invoke() vostri ambienti
  • DoEvents di chiamata() e permettono gui per aggiornare tra il DoWork chiama
  • fare tutto il lavoro e aggiornare in seguito
Problemi correlati