2012-06-19 6 views

Odpowiedz

14

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

Aby umożliwić nici tła do wykonywania operacji na obiektach należących do interfejsu gwintem, stosowane są metody syncExec (Runnable uruchamialny) i asyncExec (Runnable uruchamialny) wyświetlaczy. Są to jedyne metody w SWT, które można wywołać z dowolnego wątku. Pozwalają one na wykonywanie operacji przez wątek UI, synchronicznie, powodując, że wątek tła oczekuje na zakończenie operacji lub asynchronicznie pozwalając wątkowi tła kontynuować wykonywanie bez czekania na wynik. Operacja wykonywana przy użyciu metody syncExec() najbliżej odpowiada równoważnemu bezpośredniemu wywoływaniu operacji interfejsu użytkownika, ponieważ wywołanie metody Java zawsze czeka na wynik przed kontynuowaniem, podobnie jak syncExec().

5

Dodawanie do odpowiedzi Tom Seidel, oto są przykłady sytuacji, w których warto skorzystać z jednej lub drugiej strony:

  • Zastosowanie asyncExec gdy chcesz zaktualizować coś w interfejsie nie dbając o wyniki. Na przykład aktualizacja etykiety lub paska postępu.

  • Użyj syncExec, gdzie kod następujący po wywołaniu tej metody musi być pewny, że interfejs jest w stałym stanie lub potrzebuje niektórych danych z interfejsu użytkownika. Na przykład pobieranie niektórych danych z okna dialogowego użytkownika. Możesz też zaktualizować widżet i zanim zrobisz cokolwiek innego (np. Inną aktualizację interfejsu użytkownika), chcesz wiedzieć, że aktualizacja widgetu została zakończona.

0

SWT implementuje model pojedynczego gwintowanego interfejsu użytkownika. W tym modelu tylko wątek UI może wywoływać operacje interfejsu użytkownika. Jeśli spróbujesz uzyskać dostęp do obiektu SWT spoza wątku UI, pojawi się wyjątek "org.eclipse.swt.SWTException: Nieprawidłowy dostęp do wątku". Aby umożliwić innym wątkom wykonywanie operacji na obiektach należących do wątku UI, SWT zapewnia metody syncExec i asyncExec.

Ten link może pomóc Ci z przykładem

Powiązane problemy