2012-06-19 10 views

risposta

14

da Q: Why do I get the error "org.eclipse.swt.SWTException: Invalid thread access"?

Per consentire thread in background per eseguire operazioni sugli oggetti appartenenti alla UI-filo, vengono utilizzati i metodi syncExec (Runnable eseguibile) e asyncExec (Runnable eseguibile) di visualizzazione. Questi sono gli unici metodi in SWT che possono essere chiamati da qualsiasi thread. Consentono a un runnable di essere eseguito dal thread dell'interfaccia utente, in modo sincrono, facendo in modo che il thread in background attenda il completamento del runnable o in modo asincrono consentendo al thread in background di continuare l'esecuzione senza attendere il risultato. Una eseguibile eseguita utilizzando syncExec() corrisponde più strettamente alla chiamata diretta equivalente all'operazione dell'interfaccia utente poiché una chiamata al metodo Java attende sempre il risultato prima di procedere, proprio come syncExec().

5

aggiunta alla risposta di Tom Seidel, qui ci sono esempi di situazioni in cui si potrebbe desiderare di utilizzare uno o l'altro:

  • Usa asyncExec quando si desidera aggiornare qualcosa nell'interfaccia utente, senza preoccuparsi della risultati. Ad esempio aggiornando un'etichetta o una barra di avanzamento.

  • Utilizzare syncExec dove il codice che segue tale chiamata di metodo deve essere sicuro che l'interfaccia utente sia in uno stato coerente o che abbia bisogno di alcuni dati dall'interfaccia utente. Ad esempio ottenere alcuni dati da una finestra di dialogo utente. Oppure aggiorni un widget e prima di fare qualsiasi altra cosa (ad esempio un altro aggiornamento dell'interfaccia utente), vuoi sapere che l'aggiornamento del widget è stato completato.

0

SWT implementa il modello di interfaccia utente a singolo thread. In questo modello, solo il thread dell'interfaccia utente può richiamare le operazioni dell'interfaccia utente. Se provi ad accedere a un oggetto SWT dall'esterno del thread dell'interfaccia utente, ottieni l'eccezione "org.eclipse.swt.SWTException: accesso al thread non valido". Pertanto, per consentire ad altri thread di eseguire operazioni su oggetti appartenenti al thread dell'interfaccia utente, SWT fornisce i metodi syncExec e asyncExec.

Questo link può essere d'aiuto con un esempio

Problemi correlati