abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
včera 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 3
včera 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 22
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 8
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 2
2.12. 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
2.12. 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 0
2.12. 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
1.12. 21:00 | Nová verze

Byla vydána beta verze Linux Mintu 18.1 s kódovým jménem Serena. Na blogu Linux Mintu jsou hned dvě oznámení. První o vydání Linux Mintu s prostředím MATE a druhé o vydání Linux Mintu s prostředím Cinnamon. Stejným způsobem jsou rozděleny také poznámky k vydání (MATE, Cinnamon) a přehled novinek s náhledy (MATE, Cinnamon). Linux Mint 18.1 bude podporován až do roku 2021.

Ladislav Hagara | Komentářů: 0
1.12. 16:42 | Nová verze

Byl vydán Devuan Jessie 1.0 Beta 2. Jedná se o druhou beta verzi forku Debianu bez systemd představeného v listopadu 2014 (zprávička). První beta verze byla vydána v dubnu letošního roku (zprávička). Jedna z posledních přednášek věnovaných Devuanu proběhla v listopadu na konferenci FSCONS 2016 (YouTube, pdf).

Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 768 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: SwingWorker

1.8.2009 13:55 Karel Maly
SwingWorker
Přečteno: 1124×

Dobry den, ucim se pracovat s tridou Java SwingWorker. Pokud tuto tridu pouziji timto zpusobem, je vse ok, vse chapu.

private Document doc;
  ...
  JButton button = new JButton("Open XML");
  button.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       SwingWorker Document, Void  worker = 
          new SwingWorker Document, Void () {
 
          public Document doInBackground() {
            Document intDoc = loadXML();
            return intDoc;
          }
          public void done() {
            doc = get();
          }
       };
       worker.execute();
     }
  });

Co vsak nevim, je jak to udelat, pokud si chci vytvorit vlastni tridu v samostatnem souboru:

public class SwingWorkerChild extends SwingWorker

Tak jak potom mohu ziskat vyslednou hodnotu bez zamrznuti GUI? Pokud bych v event dispatch thread zavolal neco takoveho

SwingWorker swingWorker = new SwingWorkerChild();
swingWorker.execute();
String result = swingWorker.get();

Tak GUI zamrzne, protoze v okamziku volani metody get() neni hodnota jeste pripravena.

Ja bych prave potreboval tu vyslednou hodnotu vratit jako String, nebo alespon zmenit text na komponente JLabel, jenze k ni nemam ze tridy SwingWorkerChild pristup.

Doufam, ze jsem to vysvetlit srozumitelne co potrebuji, budu rad za jakekoliv navrhy, dekuji.

Odpovědi

2.8.2009 10:14 ZAH | skóre: 42 | blog: ZAH
Rozbalit Rozbalit vše Re: SwingWorker
Chtělo by si to něco přečíst o vláknech a jejich synchronizaci. Řekněme, že v hlavním vlákně obsluhujete tlačítko , které spouští worker. Chete li okamžitě po stisku tlačítka pokračovat v provádění hlavního programu a přitom čekat na výsledek třídy worker je asi nejvhodnější použití třídy Timer viz nedávná diskuze k programu na měření reakce. Timer s opakováním a u workru get s timeoutem.

Nebo nové vlákno čekající na get workru.
2.8.2009 10:28 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: SwingWorker
Použití časovače pro čekání na výsledek je nesmysl, vždyť SwingWorker sám vyvolá při ukončení metodu done().
2.8.2009 11:00 ZAH | skóre: 42 | blog: ZAH
Rozbalit Rozbalit vše Re: SwingWorker
Worker pak musí něco vědět o volající třídě, aby mohla metoda done nějak rozumně předat data. Použiji li čekání na get ať v jakékoliv podobě nemusí worker nic vědět o volající třídě.

Mám li například worker, který vrací složitě sestavovaný XML a který předpokládám použít mohokrát v různých třídách, kloním se jednoznačně k počkání na výsledek. Jde li však o jednoúčelák bude assi jednodušší modifikace done.
2.8.2009 11:12 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: SwingWorker
Mám li například worker, který vrací složitě sestavovaný XML a který předpokládám použít mohokrát v různých třídách, kloním se jednoznačně k počkání na výsledek.
To já také. Ale časovač není počkání na výsledek, ale opakované dotazování – dalo by se říci i otravování ;-) – „už je výsledek hotov?“ Navíc tím budete stále blokovat AWT vlákno (i když nastavíte pro get() nějaký krátký čas), nebo kvůli tomu musíte zase vytvářet nové vlákno. Oním „čekáním“ pak strávíte zbytečně moc času – jak při programování, tak při samotném běhu programu.

Pokud se bude výsledek používat v mnoha třídách, vytvořil bych si k tomu interface pro posluchače událostí, a SwingWorker by v metodě done() pouze vyvolal příslušnou událost oznamující dokončení práce.
2.8.2009 12:04 ZAH | skóre: 42 | blog: ZAH
Rozbalit Rozbalit vše Re: SwingWorker
Ono asi skutečně záleží na okolnostech. Otravování může zároveň kontrolovat průběh akce viz getProgress, vyžádat si interakci atd.

Jinak zajímavým řešením je posluchač pro událost progress dosahne maxima = volám metodu get. Musí samozřejmě podpořit worker.V tomto případě nemusím vytvářet dokumentovat nové rozhraní.
2.8.2009 12:53 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: SwingWorker
Otravování může zároveň kontrolovat průběh akce viz getProgress
To je lepší udělat tak, že se vytvoří posluchač, který naslouchá změně property progress.
2.8.2009 13:28 ZAH | skóre: 42 | blog: ZAH
Rozbalit Rozbalit vše Re: SwingWorker
Nějak jsme se rozkecali. Tak jen takovou drobnost, jestliže použiji pouze posluchače na progress a tam se mi zarazí (to znamená může zarazit) . Nikdy se to nedozví hlavní vlákno, při otravování toto ošetřím. Je samozřejmě možné a někdy i vhodné tento stav šetřit v workeru, ale někdy ne. Ono čekat na načtení informace může být jednou vteřiny moc a podruhá minuty málo.
2.8.2009 16:56 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: SwingWorker
K tomu opět nepotřebujete hlavní vlákno a časovač – buď dáte možnost přerušení uživateli, a pak worker přerušíte na jeho pokyn, nebo můžete worker ukončit třeba načasovaným Executorem. Přes časovač v AWT vlákně a pravidelné dotazování můžete řešit leccos okolo SwingWorkeru, ale zpravidla existuje lepší řešení bez časovače :-)
2.8.2009 10:16 kuka
Rozbalit Rozbalit vše Re: SwingWorker

Nechapu kde je problem. Kdyz se pouzije SwingWorkerChild na miste puvodniho pouziti anonymni tridy tak se stane co?

2.8.2009 10:26 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: SwingWorker
SwingWorker funguje tak, že se „práce“ provádí v jiném vlákně na pozadí, takže nemůžete hned získat výsledek. Naopak vám SwingWorker dá zavoláním metody done() „vědět“, kdy práce skončila. Takže pokud chcete uživatele informovat o tom, že probíhá nějaká akce a chcete mu umožnit ji např. přerušit, ještě před zavoláním execute() vytvoříte dialogové okno, kde bude nějaký nápis o tom, co právě probíhá, a tlačítko k přerušení. V metodě done() pak vypíšete výsledek zpracování a onen dialog uzavřete. Samozřejmě není nutné zobrazovat dialog, stačí třeba přesýpací hodiny (pak ale uživatel nemá možnost akci přerušit), nebo – pokud na dokončení nic jiného nezávisí – můžete nechat akci probíhat jen na pozadí a na konci třeba jen vypsat zprávu do stavového řádku. Ale pokud chcete získat výsledek, měl byste jej získávat právě v metodě done() nebo v kódu, který je touto metodou vyvolán. Případně také můžete použít blokující get(), který čeká jen určitou dobu – ale ani ten byste neměl volat z AWT vlákna.

Jinak v dokumentaci SwingWorkeru je použití myslím docela dobře popsáno.
2.8.2009 11:01 Karel Maly
Rozbalit Rozbalit vše Re: SwingWorker

Dekuji sice za vysvetleni, ale to co jste napsal je mi zname, dokumentaci jsem studoval i jsem studoval SwingWorker examples ruzne na internetu a VSUDE, kde vytvareli tridu ktera dedi od SwingWorker, tak ji meli jako vnitrni tridu te hlavni GUI tridy - tak to funguje, vse ok. Mne jde o to - kvuli prehlednosti - umistit tu tridu ktera dedi od SwingWorker do samostatneho souboru. Pak jiz nemuzu v jeji metode done() jednoduse zavolat neco takoveho:

promenna_GUI_tridy = get();

Chapu to tedy dobre, ze v tomto pripade je konvenci pouzit vnitrni tridy, abych prave zamezil tomuto problemu?

2.8.2009 11:07 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: SwingWorker
Buď tomu SwingWorkeru předejte vaši GUI třídu jako parametr, nebo si pro ni vytvořte nějaký interface a předávejte ten, nebo použijte posluchače událostí – GUI třída bude posluchač a SwingWorker vyvolá příslušnou událost.
2.8.2009 11:57 Karel Maly
Rozbalit Rozbalit vše Re: SwingWorker

To prvni reseni jsem tedy zkusil implementovat nejak takto:

GUI trida:

public class SwingWorkerTest extends javax.swing.JFrame {

    protected String result;

    public void setResult(String result)
    {
        this.result = result;
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)                                         
    {                                               
        SwingWorker swingWorker = new SwingWorkerChild(this);
        swingWorker.execute();
        jLabel1.setText(result);
     }
     ...
}

SwingWorker trida:

public class SwingWorkerChild extends SwingWorker String, Void 
{
    protected String result;
    protected SwingWorkerTest GUIClass;

    public SwingWorkerChild(SwingWorkerTest GUIClass)
    {
        this.GUIClass = GUIClass;
    }

    @Override
    public String doInBackground()
    {
        try
        {
            Thread.sleep(4000);
        } catch (InterruptedException ex)
        {
            ex.printStackTrace();
        }
        return "Hello" + " " + "there!";
    }

    @Override
    public void done() {
        try
        {
            GUIClass.setResult(get());
            //System.out.println("Result = "+result);
        } catch (InterruptedException ex)
        {
            ex.printStackTrace();
        } catch (ExecutionException ex)
        {
            ex.printStackTrace();
        }
    }

}

Jenze jsem narazil na ten samy problem zde:

swingWorker.execute();
jLabel1.setText(result);

 

V momente kdy chci pouzit promennou result, tak ta jeste neni hotova a do JLable1 se ulozi prazdny text. Resenim by asi bylo z metody done() rovnou menit ten text na jLabel1 - tak jste to myslel?

 

Chtel bych se zeptat na to treti reseni, mohl byste prosim nacrtnou kostru jak by to pro tento pripad asi vypadalo? Dekuji

2.8.2009 12:51 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: SwingWorker
To volání jLabel1.setText(result); přesuňte do metody public void setResult(String result).
2.8.2009 14:37 Karel Maly
Rozbalit Rozbalit vše Re: SwingWorker

No jasne, nechapu, ze me to nenapadlo, skoro se az stydim, ze jsem se na to ptal:)

 

...nebo použijte posluchače událostí – GUI třída bude posluchač a SwingWorker vyvolá příslušnou událost.

 

Muzete me prosim nasmerovat na nejaky navod/tutorial, kde je tady tento zpusob nejak prehledne popsan?

2.8.2009 16:52 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: SwingWorker
Možná bude něco v návrhových vzorech, něco možná bude popsáno v Writing Event Listeners.
3.8.2009 10:29 Karel Maly
Rozbalit Rozbalit vše Re: SwingWorker

Nikde jsem ale nenasel, jakou udalost vyvola dokonceni te metody doInBackground(). Jakou udalost mam tedy v naslouchajici tride (GUItrida) odchytavat?

3.8.2009 10:58 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: SwingWorker
Sám o sobě SwingWorker vyvolává pouze události o změně property state, a volání setProgress() vyvolá událost o změně property progress. Pokud chcete volat událost při skončení práce, musíte si připravit nějakou událost sám a vyvolat ji v metodě done().
3.8.2009 11:15 Karel Maly
Rozbalit Rozbalit vše Re: SwingWorker

Ano, to jsem si myslel, ale prave jsem nikde nemohl najit zadny ukazkovy priklad, kde se vytvari, spousti a odchytava vlastni udalost - ani v tech odkazech vyse. Mohl byste mi sem prosim napsat kostru jak by to vypadalo nebo alespon odkazat na priklad?

3.8.2009 12:00 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: SwingWorker
Třeba takhle. Vaše GUI třída pak bude implementovat WorkerFinishListener nebo bude mít anonymní nebo vnitřní třídu tohoto typu a zaregistruje si ji do MySwingWorkeru.
public interface WorkerFinishListener<T> {
  public void finished(SwingWorker<T> worker);
}

public class MySwingWorker extends SwingWorker<T, V> {
  private final List<WorkerFinishListener<T>> finishListeners = new LinkedList<WorkerFinishListener<T>>();

  public void addFinishListener(WorkerFinishListener<T> listener) {
    finishListeners.add(listener);
  }

  public void removeFinishListener(WorkerFinishListener<T> listener) {
    finishListeners.remove(listener);
  }

  @Override
  public void done() {
    for (WorkerFinishListener<T> listener : finishListeners) {
      listener.finished(this);
    }
  }

  …
}

class MyForm extends JForm {

  public void zacatekCinnosti() {
    final MySwingWorker<WorkResult> worker = new MySwingWorker<WorkResult>();
    worker.addFinishListener(
      new WorkerFinishListener () {
          public void finished(worker) {
            try {
              MyForm.this.setStatus("Hotovo. Výsledek je: "+worker.get().toString());
            } catch (ExecutionException ex) {
              MyForm.this.setStatus("Došlo k chybě. "+ex.getCause().getLocalizedMessage());
            }
          }
      }
    );
    worker.execute();
  }

  …
}
4.8.2009 10:50 Karel Maly
Rozbalit Rozbalit vše Re: SwingWorker

Dekuji, uz jsem se k tomu postupne dopracovaval, ale Vas kod mi hodne pomohl. Mel bych jeste dotaz, proc pisete u definice toho interface i jinde <T> - myslel jsem ze toto se pouziva pouze v dokumentaci. Ani mi to IDE nechtelo vzit, tak jsem <T> vsude smazal a funguje to...

4.8.2009 11:30 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: SwingWorker
<T> je označení parametrizovaného typu, což je jedna část generik přidaných v Javě 5. Pokud to chcete používat, musíte kompilátoru i IDE říct, že jde o kód pro Javu verze 1.5 nebo 1.6. Pokud píšete v Javě 5 nebo vyšší (doporučuju, pokud nemáte nějaký vážný důvod zůstávat u 1.4; a Java 6 je lepší než pětka, jsou tam vylepšené některé věci ve Swingu a další), doporučuju generiky používat, zjednoduší se tím používání vašich tříd (není nutné přetypovávat návratové hodnoty apod.) a zároveň se zvýší typová bezpečnost v době překladu (např. pokud se do kolekce čísel pokusíte strčit String, a používáte správně generiky, ohlásí chybu už překladač, a ne že program spadne až za běhu když se pokusíte tím Stringem násobit).

Docela podrobný úvod do novinek Javy 5 napsal pan Pecinovský v knížce Java 5.0 – Novinky jazyka a upgrade aplikací, která je teď zdarma ke stažení. Zrovna generiky tam nejsou popsané úplně ve všech detailech, ale je tam toho víc, než si normální smrtelník přeje vědět :-)
4.8.2009 13:41 cronin | skóre: 48
Rozbalit Rozbalit vše Re: SwingWorker
Tak, tak, generiky su sice pre zaciatocnika asi nie prave najjednoduchsie, ale rozhodne stoji za to is ich nastudovat. Pre zaciatok staci zvladat generifikovane kolekcie, neskor sa s nimi daju robit doslova divoke veci; pozri napr. konstruktor tejto triedy.
6.8.2009 09:53 Karel Maly
Rozbalit Rozbalit vše Re: SwingWorker

Dekuji moc za vysvetleneni, mam snad uz posledni dotaz. Proc tam vytvarime to vlastni rozhrani, slo by to i bez neho, ne?

6.8.2009 11:00 Filip Jirsák | skóre: 66 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: SwingWorker
Šlo, pokud byste použil přímo konkrétní typ GUI komponenty. Takhle je ale ta třída obecná a můžete ji použít opakovaně pro všechny komponenty, které to rozhraní implementují. Nebo ten SwingWorker můžete použít i v testu (např. JUnit), kde mu nepředáte žádnou GUI komponentu, ale jednoduchou třídu, která bude navázána právě na ten test. Záleží na tom, jak to chcete využívat – pokud máte jedinou GUI komponentu, žádné testy (nebo netestujete ten SwingWorker), je jednodušší použít přímo konkrétní typ; pokud bude onen SwingWorker naopak součástí třeba nějakého malého frameworku, budete jej ve své aplikaci používat pro různé GUI komponenty, budete jej i testovat, pak se vyplatí mít takovéhoto obecného předka, od kterého pak vždy pro konkrétní práci odvodíte konkrétního potomka.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.