Trådbehandlingsspørsmål

Når du arbeider med et widget-verktøysett, er det viktig å forstå den underliggende trådmodellen som brukes til å lese og tildele plattformens GUI-hendelser. Implementeringen av brukergrensesnittråden påvirker reglene som skal følges i applikasjonene når Java-tråder brukes i koden.

Intern hendelsestildeling

I enhver applikasjon med grafisk brukergrensesnitt, uavhengig av språk eller verktøysett for brukergrensesnittet, oppdager operativsystemplattformen GUI-hendelser og legger dem i applikasjonens hendelseskøer. Selv om det er noe forskjell på mekanismene i de ulike operativsystemplattformene, er den grunnleggende mekanismen den samme. Når brukeren klikker med musen, skriver inn tegn eller åpner vinduer, genererer operativsystemet hendelser i det grafiske brukergrensesnittet i applikasjonen, for eksempel museklikk, tastetrykk eller hendelser for vindusfargelegging. Det avgjør hvilket vindu og applikasjon som skal motta en hendelse, og legger den i applikasjonens hendelseskø.

Den underliggende strukturen for applikasjoner med et grafisk brukergrensesnitt er en hendelsessløyfe. Applikasjoner initialiserer og starter deretter en sløyfe som leser og reagerer på GUI-hendelsene fra køen. Alt arbeid som utføres mens en av disse hendelsene håndteres, må skje raskt for at det grafiske brukergrensesnittsystemet skal være operativt for brukeren.

Tidkrevende operasjoner som utløses av brukergrensesnitthendelser, skal utføres i en separat tråd slik at hendelsessløyfetråden returneres raskt og henter neste hendelse fra applikasjonskøen. Tilgang til widgeter og plattformens programmeringsgrensesnitt fra andre tråder må kontrolleres med eksplisitt låsing og serialisering. En applikasjon som ikke følger reglene, kan føre til et mislykket operativsystemkall, eller enda verre, låsing av hele det grafiske brukergrensesnittsystemet.

SWT-brukergrensesnittråd

SWT følger den trådmodellen som støttes direkte av plattformene. Applikasjonen kjører hendelsessløyfen i hovedtråden og sletter hendelser direkte fra denne tråden. Brukergrensesnittråden er tråden der Display ble opprettet. Alle andre widgeter må opprettes i brukergrensesnittråden.

Siden all hendelseskode utløses fra applikasjonens brukergrensesnittråd, får applikasjonskoden som håndterer hendelser, fritt tilgang til widgeter og kan utføre grafiske kall uten å bruke spesialteknikker. Applikasjonen skal imidlertid forgrene beregningstråder når det utføres tidkrevende operasjoner som et svar på en hendelse.

Merk: SWT utløser en SWTException for kall som utføres fra en tråd uten brukergrensesnitt, men som skal utføres i en brukergrensesnittråd.

Hovedtråden, inkludert hendelsessløyfen for en SWT-applikasjon, har følgende struktur:

   public static void main (String [] args) {
      Display display = new Display ();
      Shell shell = new Shell (display);
      shell.open ();
      // start the event loop. We stop when the user has done
      // something to dispose our window.
      while (!shell.isDisposed ()) {
         if (!display.readAndDispatch ())
            display.sleep ();
      }
      display.dispose ();
   }

Når widgetene er opprettet og skallet er åpnet, leser og tildeler applikasjonen hendelser fra operativsystemkøen til skallvinduet er fjernet. Hvis det ikke er hendelser i køen, settes visningen i sovetilstand for å gi andre applikasjoner mulighet til å kjøre.

SWT inneholder spesielle tilgangsmetoder for kall av widget og grafikkode fra en bakgrunnstråd.

Utføre kode fra en tråd uten brukergrensesnitt

Applikasjoner som vil kalle brukergrensesnittkode fra en tråd uten brukergrensesnitt, må oppgi en Runnable som kaller brukergrensesnittkoden. Metodene syncExec(Runnable) og asyncExec(Runnable) i Display-klassen brukes til å kjøre disse kjørbare filene i en brukergrensesnittråd i hendelsessløyfen.

Følgende kodesnutt viser mønsteret for bruk av disse metodene:

   // do time-intensive computations
   ...
   // now update the UI. We don't depend on the result,
   // so use async.
   display.asyncExec (new Runnable () {
      public void run () {
         if (!myWindow.isDisposed())
            myWindow.redraw ();
      }
   });
   // now do more computations
   ...

Du bør kontrollere om widgeten slettes fra den kjørbare filen når du bruker asyncExec. Siden det kan skje andre ting i brukergrensesnittråden mellom kallet til asyncExec og utføring av den kjørbare filen, er det ikke mulig å være sikker på hvilken tilstand widgetene er i når den kjørbare filen utføres.

Arbeidsbenken og tråder

Trådbehandlingsreglene er svært tydelige når du implementerer en SWT-applikasjon fra grunnen av, siden du kontrollerer opprettelsen av hendelsessløyfen og beslutningen om å forgrene beregningstråder i applikasjonen.

Dette blir litt mer komplisert når du bidrar med plugin-kode i arbeidsbenken. Følgende regler anses som "gjeldende regler" når plattformens brukergrensesnittklasser brukes, selv om det kan være at reglene er litt forskjellige i de ulike utgivelsene: