Työympäristön samanaikaisuustuki

Edellä on huomattu, että JFace-käyttöliittymässä on perustuki, joka esittää tehtävien tilannetiedot valintaikkunassa (lisätietoja on ohjeaiheessa Pitkäkestoiset toiminnot). Ohjeaiheessa Samanaikaisuuden rakenne tarkasteltiin ympäristön ajonaikaista tukea samanaikaisuudelle ja pitkäkestoisille toiminnoille. Seuraavaksi tutkitaan, miten ympäristön käyttöliittymä parantaa tätä rakennetta org.eclipse.ui.progress-paketissa. Tämä paketti toimittaa käyttöliittymälle työn tilannetietojen näyttämisen työympäristössä ja määrittää lisätuen töille, jotka ajetaan käyttöliittymän säikeessä.

Aluksi tarkastellaan erilaisia mahdollisesti ajossa olevia taustatoimintoja ja sitä, miten ne näkyvät työympäristön käyttöliittymässä:


Kun ympäristössä voi tapahtua samaan aikaan useita asioita, käyttäjä tarvitsee

Tilannetietopalvelu

Työympäristön tilannetietopalvelu (IProgressService) on ensisijainen rajapinta työympäristön tilannetietojen tuelle. Sen voi poimia työympäristöstä ja käyttää sitten näyttämään tilannetiedot sekä taustatoiminnoista että toiminnoista, jotka ajetaan käyttöliittymän säikeessä. Tämän luokan pääasiallisena tarkoituksena on tuottaa hyvät toimintojen ajomahdollisuudet, jolloin lisäosien kehittäjien ei tarvitse päättää, mitä mekanismia käytetään tilannetietojen näyttämiseen tietyssä tilanteessa. Etuna on myös se, että näillä metodeilla näyttöön tuotu tilannetietojen valintaikkuna tukee hyvin osoitusta siitä, milloin toinen toiminto lukitsee toiminnon, jolloin käyttäjä voi ratkaista ristiriidan. Pitkäkestoiset toiminnot tulisi ajaa IProgressService#busyCursorWhile-metodilla, jos se on mahdollista:

   IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
   progressService.busyCursorWhile(new IRunnableWithProgress(){
         public void run(IProgressMonitor monitor) {
         //tee käyttöliittymään liittymätöntä työtä
      }
   });

Tämä metodi tulostaa aluksi varatun kohdistimen ja korvaa sen sitten tilannetietojen valintaikkunalla, jos toiminto kestää määritettyä aikaa kauemmin. Tämän metodin etuna tilannetietojen valintaikkunaan verrattuna on, että tilannetietojen valintaikkunaa ei näytetä, jos toiminto on lyhytaikainen. Jos toiminnon on päivitettävä käyttöliittymä, voit aina ajaa käyttöliittymää muuttavan koodin Display.asyncExec- tai Display.syncExec-metodilla.

Jos toiminto on ajettava kokonaan käyttöliittymän säikeessä, tulee käyttää IProgressService#runInUI-metodia. Tämä metodi tuo näyttöön myös tilannetietojen valintaikkunan, jos toiminto on lukittu, ja antaa hallinnan käyttäjälle.

   progressService.runInUI(
      PlatformUI.getWorkbench().getProgressService(),
      new IRunnableWithProgress() {
         public void run(IProgressMonitor monitor) {
            //tee käyttöliittymään liittyvää työtä
         }
      },
      Platform.getWorkspace().getRoot());

Kolmas parametri voi olla null tai toiminnon ajoitussääntö. Tässä esimerkissä määritetään työympäristön juuri, joka lukitsee työympäristön tämän käyttöliittymätoiminnon ajon ajaksi.

Voit rekisteröidä tilannetietopalvelun sisältävälle työperheelle myös kuvakkeen niin, että tilannetietonäkymä voi näyttää kuvakkeen ajossa olevan perheen vieressä. Seuraavasta esimerkistä näkyy, miten automaattisen koonnin työperhe liitetään kuvakkeeseensa:

   IProgressService service = PlatformUI.getWorkbench().getProgressService();
   ImageDescriptor newImage = IDEInternalWorkbenchImages.getImageDescriptor(
      IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC);
   service.registerIconForFamily(newImage, ResourcesPlugin.FAMILY_MANUAL_BUILD);
   service.registerIconForFamily(newImage, ResourcesPlugin.FAMILY_AUTO_BUILD);

Näyttää, että osa on varattu

IWorkbenchSiteProgressService sisältää sovellusohjelmaliittymän sellaisten töiden ajoitusta varten, jotka muuttavat työympäristön osan ulkoasua työn ajon aikana. Jos lisäosa ajaa taustatoimintoja, jotka vaikuttavat osan tilaan, voit ajoittaa työn osan kautta, ja käyttäjä saa palautteen siitä, että osa on varattu. Esimerkki:

   IWorkbenchSiteProgressService siteService =
      (IWorkbenchSiteProgressService)view.getSite().getAdapter(IWorkbenchSiteProgressService.class);
   siteService.schedule(job, 0 /* now */, true /* use the half-busy cursor in the part */);

Töiden tilannetietojen ominaisuudet

Työympäristö määrittää töiden tilannetietoja koskevat ominaisuudet IProgressConstants-rajapinnassa. Niiden avulla voi ohjata, miten työ näkyy tilannetietonäkymässä. Niiden avulla voi määrätä tilannetietonäkymän pitämään (IProgressConstants#KEEP_PROPERTY) työn näkymässä sen päättymisen jälkeen tai pitämään yhden(IProgressConstants#KEEPONE_PROPERTY) työn kerrallaan näkymässä. Voit myös liittää toiminnon (IProgressConstants#ACTION_PROPERTY) työhön. Kun työhön on liitetty toiminto, tilannetietonäkymässä näkyy hyperlinkki, jolla käyttäjä voi ajaa toiminnon. Voit myös selvittää, näkyykö käyttäjän työ parhaillaan tilannetietojen valintaikkunassa (IProgressConstants#PROPERTY_IN_DIALOG). Tilarivin oikeassa alareunassa on vihje, kun toiminto on käytettävissä. Seuraava esimerkki käyttää näitä ominaisuuksia:

   Job job = new Job("Do Work") {
      public IStatus run(IProgressMonitor monitor) {
         // tee jotain työtä.  
         // Pidä valmis työ tilannetietonäkymässä vain, jos ei ole ajossa tilannetietojen valintaikkunassa
         Boolean inDialog = (Boolean)getProperty(IProgressConstants.PROPERTY_IN_DIALOG);
         if(!inDialog.booleanValue())
            setProperty(IProgressConstants.KEEP_PROPERTY, Boolean.TRUE);
      }
   };
   job.setProperty(IProgressConstants.ICON_PROPERTY, Plugin.getImageDescriptor(WORK_IMAGE));
   IAction gotoAction = new Action("Results") {
      public void run() {
         // näytä tulokset
      }
   };
   job.setProperty(IProgressConstants.ACTION_PROPERTY, gotoAction);
   job.setUser(true);
   job.schedule();

Työympäristön työt

Pitkäkestoiset toiminnot tulisi tehdä käyttöliittymän säikeen ulkopuolella, jos se on mahdollista. Tätä ei voi kuitenkaan aina välttää, kun toiminnon tarkoituksena on päivittää käyttöliittymä. Ohjeaiheessa SWT-säikeet kerrotaan, miten tämän voi tehdä SWT-näytön avulla. Työympäristö määrittää erityisen työn UIJob, jonka ajometodi ajetaan SWT asyncExec -metodin sisällä. UIJob-työn aliluokkien tulee toteuttaa runInUIThread-metodi run-metodin sijaan.

WorkbenchJob laajentaa UIJob-luokan niin, että työn voi ajoittaa tai ajaa vain silloin, kun työympäristö on ajossa. Kuten aina, käyttöliittymän säikeen liiallista työtä tulee välttää, sillä käyttöliittymä ei päivity käyttöliittymätyön aikana.