Při práci se sadou nástrojů prvku widget je důležité rozumět základnímu modelu vláken, který se používá pro čtení a odbavování událostí GUI platformy. Implementace vlákna uživatelského rozhraní ovlivňuje pravidla, která musí aplikace dodržovat, když ve svém kódu používá vlákna jazyka Java.
Pod každou aplikací GUI, bez ohledu na její jazyk nebo sadu nástrojů uživatelského rozhraní, platforma OS detekuje událost GUI a umístí je do fronty událostí aplikace. I když je mechanizmus na různých platformách OS mírně odlišný, základ je podobný. Když uživatel klepne myší, napíše znak nebo otevře okno, OS vygeneruje událost GUI aplikace, jako je klepnutí myší, klávesový úhoz nebo událost vykreslení okna. Určí, které okno a aplikace mají každou událost obdržet a umístí je do fronty událostí aplikace.
Základní strukturou pro každou aplikaci GUI s okny je smyčka událostí. Aplikace inicializuje a pak spustí smyčku, která jednoduše čte události GUI z fronty a odpovídajícím způsobem reaguje. Jakákoli práce provedená při ošetření jedné z těchto událostí se musí odehrát rychle, aby systém GUI stále rychle reagoval na uživatele.
Dlouhé operace spuštěné událostmi uživatelského rozhraní je nutno provést v samostatném vlákně, aby vlákno smyčky událostí mohlo reagovat rychle a načíst další událost z fronty aplikace. Ovšem přístup k prvkům widget a API platformy z jiných vláken musí být kontrolován s explicitním zamykáním a sterilizací. Aplikace, která nedodržuje pravidla, může způsobit selhání volání OS, anebo ještě hůře zablokovat celý systém GUI.
SWT dodržuje model používání vláken podporovaný přímo platformami. Program aplikace má ve svém hlavním vlákně spuštěnou smyčku událostí a odbavuje události přímo z tohoto vlákna. Vlákno uživatelského rozhraní je vláknem, ve kterém byl vytvořen Display. Všechny ostatní prvky widget musejí být vytvářeny ve vláknu uživatelského rozhraní.
Protože celý kód události je spouštěn z vlákna uživatelského rozhraní aplikace, aplikační kód, který ošetřuje události, může volně vstupovat do prvků widget a provádět volání grafiky bez jakékoli speciální techniky. Avšak aplikace je odpovědná za větvení výpočetních vláken při provádění dlouhých operací v reakci na událost.
Poznámka: SWT spustí SWTException pro každé volání provedené z vlákna nespadajícího do uživatelského rozhraní, které musí být provedeno z vlákna uživatelského rozhraní.
Hlavní vlákno aplikace SWT včetně smyčky událostí má následující strukturu:
public static void main (String [] args) { Display display = new Display (); Shell shell = new Shell (display); shell.open (); // Spusťte smyčku události. Zastavíme ji, když uživatel provede // něco k likvidaci našeho okna. while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); }
Jakmile jsou prvky widget vytvořeny a okno prostředí je otevřeno, aplikace čte a odbavuje události z fronty OS, dokud není okno prostředí zlikvidováno. Pokud nemáme k dispozici žádnou událost ve frontě, sdělíme obrazovce, aby spala, abychom dali jiným aplikacím možnost zpracování.
SWT poskytuje speciální metody přístupu pro volání prvku widget a grafického kódu z vlákna na pozadí.
Aplikace, které chtějí volat kód uživatelského rozhraní z vlákna nespadajícího do uživatelského rozhraní, musejí poskytovat rozhraní Runnable, které volá kód uživatelského rozhraní. Metody syncExec(Runnable) a asyncExec(Runnable) ve třídě Display se používají k provádění těchto procesů ve vlákně uživatelského rozhraní při provádění smyčky událostí.
Následující úsek kódu demonstruje vzor pro použití těchto metod:
// Provést časově náročné výpočty ... // nyní aktualizovat UI. Nezáleží nám na výsledku, // proto použijeme asynchronní. display.asyncExec (new Runnable () { public void run () { if (!myWindow.isDisposed()) myWindow.redraw (); } }); // Nyní proveďme více výpočtů ...
Při použití asyncExec je dobrým zvykem ověřovat, zda je prvek widget zlikvidován v rámci běhového modulu. Protože se ve vlákně uživatelského rozhraní mezi voláním asyncExec
a provedením vašeho spustitelného procesu může udát řada věcí, nikdy nemůžete mít jistotu o stavu svých widgetů během provádění svého spustitelného procesu.
Pravidla používání vláken jsou velmi jasná, když implementujete aplikaci SWT od základu, protože kontrolujete vytváření smyčky událostí a rozhodnutí o větvení výpočetních vláken ve své aplikaci.
Věci se poněkud komplikují, pokud do pracovní plochy přispíváte kódem modulu plug-in. Následující pravidla lze považovat za obecná pravidla používání tříd grafického rozhraní platformy, i když od verze k verzi lze sledovat určité výjimky z těchto pravidel: