Re: Swing a uvolnovani Window

2010-01-28 Tema obsahu Robert Novotny

Je tam extra sekcia Responding to Window Closing Events :-)

By default, when the user closes a frame onscreen, the frame is hidden. 
Although invisible, the frame still exists and the program can make it 
visible again. If you want different behavior, then you need to either 
register a window listener that handles window-closing events, or you 
need to specify default close behavior using the 
|setDefaultCloseOperation| method. You can even do both.


Pod tym traktat ku konstantnam.

A hej, suhlasim, priklady su casto neuplne, napr. JDBC je povestne zlymi 
prikladmi, ktore
malokedy zatvoria vsetky connectiony, resultsety a statementy poriadne. 
Ludia to potom kopiruju

rovno do kodu, a potom to robi podivnosti.


On 27. 1. 2010 16:34, Ondra Medek wrote:

Ale chapem, ze casto clovek vpadne do technologie a neexistuje priestor /
cas / prilezitost na tutorialove upozornenia.
 

Zadne tutorialove upozornenia nevidim:

http://java.sun.com/docs/books/tutorial/uiswing/components/dialog.html
http://java.sun.com/docs/books/tutorial/uiswing/components/frame.html

I nektere priklady jinde na webu jsou spatne:

http://www.java2s.com/Code/Java/Swing-JFC/Createsimpleaboutdialog.htm

A JInternalFrame ma default close operation jako DISPOSE, aby to
nebylo tak jednoduche :-)

Nechci zacit flame, ale treba C# to ma vyresene lepe. Jako nektere
dalsi veci, jak uz zde bylo zmineno.

   




Re: Swing a uvolnovani Window

2010-01-27 Tema obsahu Kamil Podlesak
Ano, použil jsem ho několikrát právě pro takovéto případy. Například
reference na session beany v EJB2 projektu, JDBC Connection/Statement
atd.

Tedy ne že by se tím vyloženě _nahradilo_ korektní
zavírání/uvolňování, ale ono se vždy najde spousta míst kde nějak to
korektní zavření chybí. Takže druhá linie je velmi praktická.

Kamil Podlešák

2010/1/26 Oto Buchta ta...@buchtovi.cz:
 Dne 26. ledna 2010 17:28 Kamil Podlesak kamil.podle...@gmail.com napsal(a):
 Ještě bych doplnil: pokud potřebuji použít finalizér, tak správné
 řešení je použít PhantomReference a speciální vlákno (daemon) které mi
 provádí úklid.

 e.p.: Pouzil uz z vas nekdo PhantomReference?

 --
 Oto 'tapik' Buchta, ta...@buchtovi.cz, http://tapikuv.blogspot.com



Re: Swing a uvolnovani Window

2010-01-27 Tema obsahu Ladislav Thon
Ksakru, měl bych zase začít sledovat svou RSS čtečku, tohle mi úplně uniklo!
FCM mi zrovna k srdci nepřirostlo, ale lepší než nic :-)

A podle Alexe Millera
http://puredanger.com/tech/2009/11/18/closures-after-all/ by možná mohlo
dojít i na ParallelArray, bomba!

LT

Dne 27. ledna 2010 8:07 Zdenek Tronicek troni...@fit.cvut.cz napsal(a):

 Tak to byly Tvoje modlitby :-). A ja si porad lamal hlavu, co primelo
 Marka Reinholda, aby zmenil nazor na closures a zahrnul je do JDK 7.
 Po jeho oznameni na Devoxxu je velmi pravdepodobne, ze closures budou. Jen
 se zatim nevi, jak budou vypadat.

 Mozna takto:

 #int(String) strLen = #(String s) {
 if (s == null) return -1;
 return s.length();
  };

 nebo takto:

 #(String: int) strLen = #(String s: int length) label:{
if (s == null) { length =-1; break label; }
length = s.length();
  };

 nebo treba i takto:

 #(String: int) strLen = #int(String s) length: {
if (s == null) break length =-1;
length = s.length();
  };

 a nebo uplne jinak.

 Z.T.
 --
 Zdenek Tronicek
 FIT CTU in Prague


 Ladislav Thon napsal(a):
  V navaznosti na tuto diskuzi bych rad poznamenal, ze jednim z navrhu na
 vylepseni Javy je Automatic Resource Management.
  Je to jeden z akceptovaných návrhů Project Coin:
  http://wikis.sun.com/display/ProjectCoin/2009ProposalsTOC, takže by se
 to
  mělo objevit v Javě 7. A já volám, když už nebyly vyslyšeny moje
 modlitby
  stran lexikálních uzávěrů: sláva! Sláva!
  Mimochodem, C# má spoustu věcí, které Javě IMHO chybí. A Groovy ostatně
 taky. To jen když už jsme se pustili do těžce off-topic témat :-) LT




Re: Swing a uvolnovani Window

2010-01-27 Tema obsahu Petr Synek
Jo to je celkem dobra konstrukce a bylo by fajn jimit v Jave taky. V C# 
to predpoklada, ze trida (jako napr. tady BufferedReader) implementuje 
IDisposable, ktera ma metodu dispose().


Podobna konstrukce je u transakci:
using(TransactionScope scope = new TransactionScope())
{
   /* Transactional work */
}


Zdenek Tronicek wrote:

V navaznosti na tuto diskuzi bych rad poznamenal, ze jednim z navrhu na
vylepseni Javy je Automatic Resource Management. Misto

static String readFirstLineFromFile(String path) throws IOException {

BufferedReader br = new BufferedReader(new FileReader(path));

try {

return br.readLine();

} finally {

br.close();

}

}

bychom pak mohli psat

static String readFirstLineFromFile2(String path) throws IOException {

try (BufferedReader br = new BufferedReader(new FileReader(path)) {

   return br.readLine();

}

}

K zavreni streamu br dojde automaticky po opusteni bloku try. Mimochodem,
C# to ma.

Z.T.


Re: Swing a uvolnovani Window

2010-01-27 Tema obsahu Ondra Medek
 Ale chapem, ze casto clovek vpadne do technologie a neexistuje priestor /
 cas / prilezitost na tutorialove upozornenia.

Zadne tutorialove upozornenia nevidim:

http://java.sun.com/docs/books/tutorial/uiswing/components/dialog.html
http://java.sun.com/docs/books/tutorial/uiswing/components/frame.html

I nektere priklady jinde na webu jsou spatne:

http://www.java2s.com/Code/Java/Swing-JFC/Createsimpleaboutdialog.htm

A JInternalFrame ma default close operation jako DISPOSE, aby to
nebylo tak jednoduche :-)

Nechci zacit flame, ale treba C# to ma vyresene lepe. Jako nektere
dalsi veci, jak uz zde bylo zmineno.


Swing a uvolnovani Window

2010-01-26 Tema obsahu Ondra Medek
Ahoj,

narazil jsem na divne chovani Swingu (AWT). Kdyz zmizim JFrame pomoci
setVisible(false), tak v pameti zustane viset pres nejaky seznam
java.awt.Window.allWindows. Tedy memory leak. Musim volat
JFrame.dispose(). Stejne u JDialog. Vzhledem k tomu, ze default close
operation u JDialog je HIDE_ON_CLOSE, pak vsechen kod typu

MyDialog().setVisible(true);

je memory leak, musim delat

JDialog d = MyDialog().setVisible(true);
d.dispose();

anebo nastavit v MyDialog() construktoru
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

Tak nevim, je to Java (SUN JRE 1.6) bug? Pokud je to ocekavane
chovani, proc neni java.awt.Window.finalize(), ktera by po sobe
uklidila? Koukam, ze v Java 5 jeste tato metoda je vyuzita, viz:

http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Window.html#finalize%28%29

ale v Java 6 chybi.

Dik
Ondra Medek


Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Filip Jirsák
Zdravím,
setVisible(false) okno nezavírá, ale pouze skryje. Pokud chcete okno zavřít,
použijte dispose() – přesně jak píšete. Memory leak to je, ale ne na straně
Swingu, ale na straně programátora, který okno skrývá když jej ve
skutečnosti chce zavřít…

S pozdravem

Filip Jirsák


Dne 26. ledna 2010 15:39 Ondra Medek xmed...@gmail.com napsal(a):

 Ahoj,

 narazil jsem na divne chovani Swingu (AWT). Kdyz zmizim JFrame pomoci
 setVisible(false), tak v pameti zustane viset pres nejaky seznam
 java.awt.Window.allWindows. Tedy memory leak. Musim volat
 JFrame.dispose(). Stejne u JDialog. Vzhledem k tomu, ze default close
 operation u JDialog je HIDE_ON_CLOSE, pak vsechen kod typu

 MyDialog().setVisible(true);

 je memory leak, musim delat

 JDialog d = MyDialog().setVisible(true);
 d.dispose();

 anebo nastavit v MyDialog() construktoru
 setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

 Tak nevim, je to Java (SUN JRE 1.6) bug? Pokud je to ocekavane
 chovani, proc neni java.awt.Window.finalize(), ktera by po sobe
 uklidila? Koukam, ze v Java 5 jeste tato metoda je vyuzita, viz:

 http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Window.html#finalize%28%29

 ale v Java 6 chybi.

 Dik
 Ondra Medek



Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Ondra Medek
Hmm, tak to soudruzi v Sunu zase neco vydumali. Kdyz udelam

window.setVisible(false);
window = null;

Tak objekt v pameti furt visi. To nepovazuji za stastne reseni. Priste
abych u kazde tridy louskal manual, jestli nahodou nema specialni
metodu, kterou musim volat, nez objekt prestanu pouzivat. Co kdyby
neco podobneho bylo treba u kazde JComponent? To bychom se z toho asi
pos.


2010/1/26 Filip Jirsák filip.jir...@gmail.com:
 Zdravím,
 setVisible(false) okno nezavírá, ale pouze skryje. Pokud chcete okno zavřít,
 použijte dispose() - přesně jak píšete. Memory leak to je, ale ne na straně
 Swingu, ale na straně programátora, který okno skrývá když jej ve
 skutečnosti chce zavřít...

 S pozdravem

 Filip Jirsák


 Dne 26. ledna 2010 15:39 Ondra Medek xmed...@gmail.com napsal(a):

 Ahoj,

 narazil jsem na divne chovani Swingu (AWT). Kdyz zmizim JFrame pomoci
 setVisible(false), tak v pameti zustane viset pres nejaky seznam
 java.awt.Window.allWindows. Tedy memory leak. Musim volat
 JFrame.dispose(). Stejne u JDialog. Vzhledem k tomu, ze default close
 operation u JDialog je HIDE_ON_CLOSE, pak vsechen kod typu

 MyDialog().setVisible(true);

 je memory leak, musim delat

 JDialog d = MyDialog().setVisible(true);
 d.dispose();

 anebo nastavit v MyDialog() construktoru
 setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

 Tak nevim, je to Java (SUN JRE 1.6) bug? Pokud je to ocekavane
 chovani, proc neni java.awt.Window.finalize(), ktera by po sobe
 uklidila? Koukam, ze v Java 5 jeste tato metoda je vyuzita, viz:


 http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Window.html#finalize%28%29

 ale v Java 6 chybi.

 Dik
 Ondra Medek





-- 
Ondra Medek


Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Ladislav Thon

 Tak objekt v pameti furt visi. To nepovazuji za stastne reseni. Priste
 abych u kazde tridy louskal manual, jestli nahodou nema specialni
 metodu, kterou musim volat, nez objekt prestanu pouzivat.


To ovšem musíte stejně. Na finalizér se nemůžete spoléhat, nikdo vám
nezaručí, že vůbec někdy bude zavolán. Uklízet po sobě je slušnost nejen
doma v obejváku :-)

LT


Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Ondra Medek
K cemu je potom GC a cely ten tezkotonazni aparat?

Pro reseni uklidu toho Window IMHO staci WeakReference a propadne
finalize() a je to.

2010/1/26 Ladislav Thon ladi...@gmail.com:
 Tak objekt v pameti furt visi. To nepovazuji za stastne reseni. Priste
 abych u kazde tridy louskal manual, jestli nahodou nema specialni
 metodu, kterou musim volat, nez objekt prestanu pouzivat.

 To ovšem musíte stejně. Na finalizér se nemůžete spoléhat, nikdo vám
 nezaručí, že vůbec někdy bude zavolán. Uklízet po sobě je slušnost nejen
 doma v obejváku :-)

 LT




-- 
Ondra Medek


RE: Swing a uvolnovani Window

2010-01-26 Tema obsahu Holý Jiří
Byl bych v těch tvrzení trochu opatrnější, co třeba takové:

Thread th = new Thread(new SomeRunnable());
th.start();
th = null; //timhle bych vlakno rozhodne zastavit nechtel


On je rozdil v tom, nastavit pointer na null a vykonat na objektu nejakou 
operaci (třeba to finalize).

Jiri Holy

-Original Message-
From: konference-boun...@java.cz [mailto:konference-boun...@java.cz] On Behalf 
Of Ondra Medek
Sent: Tuesday, January 26, 2010 4:43 PM
To: Java
Subject: Re: Swing a uvolnovani Window

Hmm, tak to soudruzi v Sunu zase neco vydumali. Kdyz udelam

window.setVisible(false);
window = null;

Tak objekt v pameti furt visi. To nepovazuji za stastne reseni. Priste
abych u kazde tridy louskal manual, jestli nahodou nema specialni
metodu, kterou musim volat, nez objekt prestanu pouzivat. Co kdyby
neco podobneho bylo treba u kazde JComponent? To bychom se z toho asi
pos.


2010/1/26 Filip Jirsák filip.jir...@gmail.com:
 Zdravím,
 setVisible(false) okno nezavírá, ale pouze skryje. Pokud chcete okno zavřít,
 použijte dispose() - přesně jak píšete. Memory leak to je, ale ne na straně
 Swingu, ale na straně programátora, který okno skrývá když jej ve
 skutečnosti chce zavřít...

 S pozdravem

 Filip Jirsák


 Dne 26. ledna 2010 15:39 Ondra Medek xmed...@gmail.com napsal(a):

 Ahoj,

 narazil jsem na divne chovani Swingu (AWT). Kdyz zmizim JFrame pomoci
 setVisible(false), tak v pameti zustane viset pres nejaky seznam
 java.awt.Window.allWindows. Tedy memory leak. Musim volat
 JFrame.dispose(). Stejne u JDialog. Vzhledem k tomu, ze default close
 operation u JDialog je HIDE_ON_CLOSE, pak vsechen kod typu

 MyDialog().setVisible(true);

 je memory leak, musim delat

 JDialog d = MyDialog().setVisible(true);
 d.dispose();

 anebo nastavit v MyDialog() construktoru
 setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

 Tak nevim, je to Java (SUN JRE 1.6) bug? Pokud je to ocekavane
 chovani, proc neni java.awt.Window.finalize(), ktera by po sobe
 uklidila? Koukam, ze v Java 5 jeste tato metoda je vyuzita, viz:


 http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Window.html#finalize%28%29

 ale v Java 6 chybi.

 Dik
 Ondra Medek





-- 
Ondra Medek


Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Ladislav Thon
GC slouží k automatické správě _paměti_ a jenom paměti. Byly sice snahy
napasovat to i na ostatní zdroje (ve Swingu se nevyznám, ale třeba JDBC je
ukázkový příklad), ale ukázalo se, že je s tím víc problémů než užitku
(deadlocky v JDBC driverech).

Možná, že ve Swingu to lze nějak bezpečně zařídit, ale obecně je spoléhání
se na finalizéry při uvolňování zdrojů Špatné (TM).

LT

2010/1/26 Ondra Medek xmed...@gmail.com

 K cemu je potom GC a cely ten tezkotonazni aparat?

 Pro reseni uklidu toho Window IMHO staci WeakReference a propadne
 finalize() a je to.

 2010/1/26 Ladislav Thon ladi...@gmail.com:
  Tak objekt v pameti furt visi. To nepovazuji za stastne reseni. Priste
  abych u kazde tridy louskal manual, jestli nahodou nema specialni
  metodu, kterou musim volat, nez objekt prestanu pouzivat.
 
  To ovšem musíte stejně. Na finalizér se nemůžete spoléhat, nikdo vám
  nezaručí, že vůbec někdy bude zavolán. Uklízet po sobě je slušnost nejen
  doma v obejváku :-)
 
  LT
 



 --
 Ondra Medek



Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Jan Medek

Mam dotaz trochu mimo tema. Zaujala me poznamka o problemech s 
deadlocky v JDBC driverech v souvislosti s GC. Vim, ze mohu pouzit google, 
nemate vsak nejaky odkaz, na clanek popisujici tento problem?

Diky

Honza


Ladislav Thon napsal(a):
GC slouží k automatické správě _paměti_ a jenom paměti. Byly sice snahy 
napasovat to i na ostatní zdroje (ve Swingu se nevyznám, ale třeba JDBC 
je ukázkový příklad), ale ukázalo se, že je s tím víc problémů než 
užitku (deadlocky v JDBC driverech).


Možná, že ve Swingu to lze nějak bezpečně zařídit, ale obecně je 
spoléhání se na finalizéry při uvolňování zdrojů Špatné (TM).


LT

2010/1/26 Ondra Medek xmed...@gmail.com mailto:xmed...@gmail.com

K cemu je potom GC a cely ten tezkotonazni aparat?

Pro reseni uklidu toho Window IMHO staci WeakReference a propadne
finalize() a je to.

2010/1/26 Ladislav Thon ladi...@gmail.com mailto:ladi...@gmail.com:
  Tak objekt v pameti furt visi. To nepovazuji za stastne reseni.
Priste
  abych u kazde tridy louskal manual, jestli nahodou nema specialni
  metodu, kterou musim volat, nez objekt prestanu pouzivat.
 
  To ovšem musíte stejně. Na finalizér se nemůžete spoléhat, nikdo vám
  nezaručí, že vůbec někdy bude zavolán. Uklízet po sobě je
slušnost nejen
  doma v obejváku :-)
 
  LT
 



--
Ondra Medek




Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Kamil Podlesak
Ještě bych doplnil: pokud potřebuji použít finalizér, tak správné
řešení je použít PhantomReference a speciální vlákno (daemon) které mi
provádí úklid.

Kamil Podlešák

2010/1/26 Ladislav Thon ladi...@gmail.com:
 GC slouží k automatické správě _paměti_ a jenom paměti. Byly sice snahy
 napasovat to i na ostatní zdroje (ve Swingu se nevyznám, ale třeba JDBC je
 ukázkový příklad), ale ukázalo se, že je s tím víc problémů než užitku
 (deadlocky v JDBC driverech).

 Možná, že ve Swingu to lze nějak bezpečně zařídit, ale obecně je spoléhání
 se na finalizéry při uvolňování zdrojů Špatné (TM).

 LT

 2010/1/26 Ondra Medek xmed...@gmail.com

 K cemu je potom GC a cely ten tezkotonazni aparat?

 Pro reseni uklidu toho Window IMHO staci WeakReference a propadne
 finalize() a je to.

 2010/1/26 Ladislav Thon ladi...@gmail.com:
  Tak objekt v pameti furt visi. To nepovazuji za stastne reseni. Priste
  abych u kazde tridy louskal manual, jestli nahodou nema specialni
  metodu, kterou musim volat, nez objekt prestanu pouzivat.
 
  To ovšem musíte stejně. Na finalizér se nemůžete spoléhat, nikdo vám
  nezaručí, že vůbec někdy bude zavolán. Uklízet po sobě je slušnost nejen
  doma v obejváku :-)
 
  LT
 



 --
 Ondra Medek




Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Ladislav Thon
Mam dotaz trochu mimo tema. Zaujala me poznamka o problemech s
 deadlocky v JDBC driverech v souvislosti s GC. Vim, ze mohu pouzit google,
 nemate vsak nejaky odkaz, na clanek popisujici tento problem?


Zkuste narvat do Googlu třeba jdbc deadlock finalize, pěkný popis je
kupříkladu tady: http://bugs.mysql.com/bug.php?id=10954.

LT


Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Ondra Medek
Tak potom melo to uvolneni zdroju byt jako default v setVisible(false)
nebo aspon jako default close operace.

Podle mne by to melo byt nastaveno tak, aby se vse uklizelo pri
nejjednodusim pouziti. Pokud uklizeni zdrzuje, tak pak se mohou
vytvorit metody pro experty, ktere uklizet nebudou.

Prave opravuji aplikaci, kde je cca 50 dialogu, 10 frames. Vetsinou se
dispose() volalo, nekdy take ne, na default close operaci se vetsinou
zapomnelo ...

2010/1/26 Ladislav Thon ladi...@gmail.com:
 GC slouží k automatické správě _paměti_ a jenom paměti. Byly sice snahy
 napasovat to i na ostatní zdroje (ve Swingu se nevyznám, ale třeba JDBC je
 ukázkový příklad), ale ukázalo se, že je s tím víc problémů než užitku
 (deadlocky v JDBC driverech).

 Možná, že ve Swingu to lze nějak bezpečně zařídit, ale obecně je spoléhání
 se na finalizéry při uvolňování zdrojů Špatné (TM).



Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Lukáš Záruba

Zdravím,
se swingem už jsem dlouho nepracoval, ale jestli se správně pamatuju, 
tak princip rušení grafických komponent je velice podobný tomu v SWT, 
takže se můj názor odvíjí od tohoto.
Okno, stejně jako většina komponent je nativní systémový resource, tedy 
něco, co je třeba po sobě manuálně uklidit. Je to podle mě stejný případ 
jako například inputstream, akorát místo file handlerů vznikají v 
systému window handlery, tedy něco co se samo určitě neuklidí. 
Spoléhat v tomto případě na finalize() mi přijde asi stejně zcestné jako 
spoléhat na to, že se sám uklidí file handler po input streamu (to, že 
opravdu zůstanou viset si asi většina z nás bolestně ověřila).
2 Ondra Medek: To že se občas dispose() nevolalo je spíš problém 
nedostatečného testování a disciplíny developerů než špatného návrhu 
Swing API. Navíc mi vzhledem k tomu, že na okně voláte setVisible(false) 
místo dispose je asi špatné použití metody setVisible, jak už někdo 
zmínil dříve, protože pokud na té samé instanci komponenty potom 
zavoláte setVisible(true) měla by se nezměněná objevit, což si dost 
dobře nedovedu představit, pokud by proběhl úklid resourců.
Vytvoření dvou sad metod, jedna pro běžné developery a jedna pro 
experty, se mi zdá jako koncept, který by přinesl spíše chaos než 
jednoduchost, protože si dost dobře dovedu představit situaci, kdy půlka 
developerů té samé aplikace používá expertní rozhraní a ta druhá spoléha 
na to, že se uklízí samo. Výsledkem by byly ty samé chyby, které by se 
daleko hůř hledaly.
Přenášet odpovědnost na GC nedává moc smysl už z podstaty GC, která 
spočívá v tom, že si běhá kdy se mu zachce a tím pádem narozdíl od c++ 
finalizerů je naprosto nevhodný pro tyto úlohy. Což já osobně považuji 
za jednu z pro mě nejoblíbenějších specifikací Javy.


S pozdravem

__
Lukáš Záruba (Lukas Zaruba)
Chief Technical Officer
MEDIA SOLUTIONS EUROPE
Lisabonská 4
Praha 9 190 00
Czech Republic



Ondra Medek napsal(a):

Tak potom melo to uvolneni zdroju byt jako default v setVisible(false)
nebo aspon jako default close operace.

Podle mne by to melo byt nastaveno tak, aby se vse uklizelo pri
nejjednodusim pouziti. Pokud uklizeni zdrzuje, tak pak se mohou
vytvorit metody pro experty, ktere uklizet nebudou.

Prave opravuji aplikaci, kde je cca 50 dialogu, 10 frames. Vetsinou se
dispose() volalo, nekdy take ne, na default close operaci se vetsinou
zapomnelo ...

2010/1/26 Ladislav Thon ladi...@gmail.com:
  

GC slouží k automatické správě _paměti_ a jenom paměti. Byly sice snahy
napasovat to i na ostatní zdroje (ve Swingu se nevyznám, ale třeba JDBC je
ukázkový příklad), ale ukázalo se, že je s tím víc problémů než užitku
(deadlocky v JDBC driverech).

Možná, že ve Swingu to lze nějak bezpečně zařídit, ale obecně je spoléhání
se na finalizéry při uvolňování zdrojů Špatné (TM).




Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Oto Buchta
2010/1/26 Ondra Medek xmed...@gmail.com:
 Tak potom melo to uvolneni zdroju byt jako default v setVisible(false)

Tady si někdo asi dělá legraci, viď? Existuje PLNÝ KRDEL objektů
neviditelných. A k tomu se (mimo jiné) právě setVisible(false)
používá. Také se to používá při dočasném zobrazení objektu - proč jej
znovu vytvářet a zahazovat? Toto prostě nebyl dobrý příklad...

 nebo aspon jako default close operace.

 Podle mne by to melo byt nastaveno tak, aby se vse uklizelo pri
 nejjednodusim pouziti. Pokud uklizeni zdrzuje, tak pak se mohou
 vytvorit metody pro experty, ktere uklizet nebudou.

Aha. Pak tedy každý expert musí nastudovat, která metoda mu pod rukou
zdroje uklízí a která ne? To mi nepřijde příliš šťastné.

Navíc co knihovní funkce? Mají či nemají uklízet?

 Prave opravuji aplikaci, kde je cca 50 dialogu, 10 frames. Vetsinou se
 dispose() volalo, nekdy take ne, na default close operaci se vetsinou
 zapomnelo ...

:-)
-- 
Oto 'tapik' Buchta, ta...@buchtovi.cz, http://tapikuv.blogspot.com


Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Filip Jirsák
K používání každého objektu si máte přečíst jeho dokumentaci – když to
neuděláte, je jen vaše chyba, když ten objekt dělá něco jiného, než byste
čekal. Navíc na chování funkce setVisible() není nic zákeřného, ona opravdu
dělá přesně to, co má v názvu. To, že vy si myslíte, že když okno nevidíte,
tak neexistuje, to není problém té metody, Swingu, ale pouze vašeho pohledu.
Ostatně okno také nejprve vytvoříte konstruktorem a pak jej zviditelníte
voláním setVisible() – už jen z toho by vás mělo trknout, že existence okna
a jeho viditelnost jsou dvě různé věci.

GC je od toho, aby z paměti odstranil objekty, které už se nepoužívají.
Pořád je ale starostí programátora to, aby zrušil odkazy na objekty, které
už nechce používat. Java nemá žádný magický mechanizmus, kterým by určovala,
že programátor už asi nechce používat okno, když ho skryl a miliony dalších
podobných heuristik, ale používá jednoduché řešení – objekt se používá,
dokud na něj jsou odkazy. I v aplikacích s GC jde vyrobit memory leaky, a to
právě tak, že programátor zapomene uvolnit některé odkazy i když už objekt
nepoužívá. Nesmíte zapomínat na to, že při konstrukci objektu nezískáváte
odkaz na objekt jenom vy jako výsledek volání konstruktoru, ale objekt sám
má na sebe odkaz přes this. A tenhle odkaz může předat někam dál. Takhle se
chovají komponenty, vlákna, spousta posluchačů událostí si drží pevné
reference na objekty, na kterých naslouchají… Je zbytečné se nad tím
rozčilovat, takhle to prostě je a nedá se říci, zda by bylo lepší řešení bez
pevných odkazů – někdy ano, jindy je lepší model s pevnými odkazy. Takže je
potřeba si opravdu nastudovat alespoň základy toho, jak s konkrétními
objekty zacházet, když je chcete začít používat.

finalize() neřeší nic, protože jediné, co je garantováno, je že finalize()
nebude na konkrétním objektu spuštěno více než jednou. To ale znamená, že
může být spuštěno jednou a nebo také vůbec.

S pozdravem

Filip Jirsák

2010/1/26 Ondra Medek xmed...@gmail.com

 K cemu je potom GC a cely ten tezkotonazni aparat?

 Pro reseni uklidu toho Window IMHO staci WeakReference a propadne
 finalize() a je to.

 2010/1/26 Ladislav Thon ladi...@gmail.com:
  Tak objekt v pameti furt visi. To nepovazuji za stastne reseni. Priste
  abych u kazde tridy louskal manual, jestli nahodou nema specialni
  metodu, kterou musim volat, nez objekt prestanu pouzivat.
 
  To ovšem musíte stejně. Na finalizér se nemůžete spoléhat, nikdo vám
  nezaručí, že vůbec někdy bude zavolán. Uklízet po sobě je slušnost nejen
  doma v obejváku :-)
 
  LT
 



 --
 Ondra Medek



Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Ondra Medek
 Aha. Pak tedy každý expert musí nastudovat, která metoda mu pod rukou
 zdroje uklízí a která ne? To mi nepřijde příliš šťastné.

Lepsi kdyz to studuje expert, nez amater. Nakonec expert by to mozna
napsal lepe v C++. Proto je Java tak oblibena, ze se v ni chyb da
delat mene a jsou snadneji odhalitelne.

Situace je jina, pokud mate aplikaci, kterou od zacatku do konce
vyvijite sam nebo aspon nad vyvojem mate dohled. V beznem zivote ale
na vas spadne existujici aplikace (nebo lepe nekolik aplikaci), na
ktere se behem radu let vystridala rada lidi s ruznym stupnem znalosti
Javy, Swingu (a pripadne hafo dalsich knihoven). Pak jste vdecny za co
nejjednodussi programove konstrukce, ve kterych nelze udelat chyba.


Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Filip Jirsák
Přičemž k těm nejjednodušším programovým konstrukcím patří třeba to, že
každá funkce dělá právě jednu činnost, a to tu, která je zdokumentovaná.
Takže například metoda setVisible(boolean) nastavuje viditelnost objektu, a
nesnaží se uhodnou, jestli si programátor náhodou neplete viditelnost s
existencí.

Existují programovací jazyky, které se jednoduchosti použití snaží docílit
tím, že před programátorem spoustu věcí skrývají a snaží se je nějak vyřešit
za něj, ale Java je přesný opak takových jazyků. Java je assembler nad JVM a
její jednoduchost spočívá v tom, že stojí na několika základních
jednoduchých principech. To ale nemá nic společného s tím, že by se
překladač nebo běhové prostředí nějak pokoušely uhodnout, co programátor
chtěl – právě naopak. Nenechte se mást tím, že má Java GC, který něco dělá
zdánlivě automaticky a bez dohledu uživatele. Za prvé jsou pravidla pro
programování s tímto typem GC možná jednodušší, než pravidla pro
programování s explicitní alokací paměti, za druhé ta automatika není mezi
uživatelským programem a JVM, ale mezi JVM a systémem. Je to asi na stejné
úrovni, jako je pro nativní programy přerovnávání instrukcí procesorem –
tedy daleko za hranicí toho, co běžně potřebujete. Pro běžné případy ale
úplně stačí vědět, že dokud existují na objekt tvrdé odkazy, je objekt
dostupný a zabírá místo v paměti.

Jinak je myslím zbytečné dál toto téma rozebírat, buďte rád, že jste se něco
o správě odkazů v Javě dozvěděl už teď při takovéhle jednoduché záležitosti
– třeba při vícevláknovém programování je někdy potřeba vědět o vzniku a
zániku referencí mnohem podrobněji, protože můžete třeba snadno pracovat s
objektem, který ještě nebyl zcela vytvořen.

Filip Jirsák

Lepsi kdyz to studuje expert, nez amater. Nakonec expert by to mozna
 napsal lepe v C++. Proto je Java tak oblibena, ze se v ni chyb da
 delat mene a jsou snadneji odhalitelne.

 Situace je jina, pokud mate aplikaci, kterou od zacatku do konce
 vyvijite sam nebo aspon nad vyvojem mate dohled. V beznem zivote ale
 na vas spadne existujici aplikace (nebo lepe nekolik aplikaci), na
 ktere se behem radu let vystridala rada lidi s ruznym stupnem znalosti
 Javy, Swingu (a pripadne hafo dalsich knihoven). Pak jste vdecny za co
 nejjednodussi programove konstrukce, ve kterych nelze udelat chyba.


Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Oto Buchta
2010/1/26 Ondra Medek xmed...@gmail.com:
 Aha. Pak tedy každý expert musí nastudovat, která metoda mu pod rukou
 zdroje uklízí a která ne? To mi nepřijde příliš šťastné.

 Lepsi kdyz to studuje expert, nez amater. Nakonec expert by to mozna
 napsal lepe v C++. Proto je Java tak oblibena, ze se v ni chyb da
 delat mene a jsou snadneji odhalitelne.

On by to expert mozna prece jen napsal v Jave ;-)

 Situace je jina, pokud mate aplikaci, kterou od zacatku do konce
 vyvijite sam nebo aspon nad vyvojem mate dohled. V beznem zivote ale
 na vas spadne existujici aplikace (nebo lepe nekolik aplikaci), na
 ktere se behem radu let vystridala rada lidi s ruznym stupnem znalosti
 Javy, Swingu (a pripadne hafo dalsich knihoven). Pak jste vdecny za co
 nejjednodussi programove konstrukce, ve kterych nelze udelat chyba.

Naprosto s vami souhlasim. Jenomze tech konstrukci, ktere Swing
pouziva, opravdu mnoho neni.
A je vzdy na aktualnim vedoucim projektu, aby mel zaruceno, ze kdyz uz
tam nejake prase programatora ma, tak ze jsou nastavene mechanismy
tak, aby se podobna zverstva (zavirani oken pomoci setVisible(false))
proste nedely.

Na zaver debaty, ve ktere asi uz nema smysl pokracovat, par poznamek:
 - Java je prave proto tak uzasna, ze se nesnazi delat za lidi to, co
by meli delat sami. Proto dela GC prave a pouze to, co dela. To, ze
nektere knihovny jsou hodne automagicke, je jejich problem, nikoli
jazyka. Mozna prave proto se v konferenci permanentne objevuji dotazy
na Hibernate, asi nejautomagictejsi knihovnu napsanou v Jave. O
pouziti JDBC se objevi jeden dotaz rok...

 - kdyz chce nekdo pouzivat knihovnu, mel by si byt setsakra jist, ze
spravne pochopil jeji principy. To, ze by si precetl jeji dokumentaci,
ho stejne nikdo nedonuti (aneb Pratchettovske Chtel bych mit jeden
bronzovy naramek za kazdeho uzivatele naseho megalitickeho pocitace,
ktery se ani neunavoval precist si manual!)

 - kdyz se predava aplikace, mela by fungovat rozumna komunikace mezi
byvalym a novym [programatorem, vedoucim, testerem,,,]. Muzeme
odchazet z firmy zneucteni, zneuziti a odkopnuti, ale nase stavovska
cest by nam mela velet predat vse v co nejlepsim poradku. Ten, kdo
prijde po mne, za to prece nemuze.

-- 
Oto 'tapik' Buchta, ta...@buchtovi.cz, http://tapikuv.blogspot.com


Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Robert Novotny
To je naozaj problem v tom, ze niekto si neprecita poriadne 
dokumentaciu, alebo niekto pred nim

si neprecita poriadne dokumentaciu a problem sa tiahne.

Ved podla mna uz prvy priklad prace so Swingom, kde si len zobrazite 
prazdne okno, vas donuti pouzit EXIT_ON_CLOSE.
Inak zistite, ze po desiatich spusteniach mate desat skrytych, ale 
nedisposenutych okien
a teda desat neviditelnych spustenych aplikacii. (U mna na cviceniach sa 
to prejavilo evidentne: ludom zacal zdochynat Eclipse :-)).


Ale chapem, ze casto clovek vpadne do technologie a neexistuje priestor 
/ cas / prilezitost na tutorialove upozornenia.


Automagicke disposovanie okien je presne taky pripad ako Connectiony, 
ResultSety a Statementy, a presne taky
isty priklad ako zatvaranie java.io.OutputStreamov ci Writerov. Nie je 
to teda ziadna rarita.


Ak vznikaju problemy, tak presne preto, ze vznika dojem, ze Java 
upratuje vsetko, vzdy a vsade, a dokonca

aj tam, kde je to vyslovne v zodpovednosti programatora.

On 26. 1. 2010 21:26, Ondra Medek wrote:

Aha. Pak tedy každý expert musí nastudovat, která metoda mu pod rukou
zdroje uklízí a která ne? To mi nepřijde příliš šťastné.
 

Lepsi kdyz to studuje expert, nez amater. Nakonec expert by to mozna
napsal lepe v C++. Proto je Java tak oblibena, ze se v ni chyb da
delat mene a jsou snadneji odhalitelne.

Situace je jina, pokud mate aplikaci, kterou od zacatku do konce
vyvijite sam nebo aspon nad vyvojem mate dohled. V beznem zivote ale
na vas spadne existujici aplikace (nebo lepe nekolik aplikaci), na
ktere se behem radu let vystridala rada lidi s ruznym stupnem znalosti
Javy, Swingu (a pripadne hafo dalsich knihoven). Pak jste vdecny za co
nejjednodussi programove konstrukce, ve kterych nelze udelat chyba.

   




Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Oto Buchta
Dne 26. ledna 2010 17:28 Kamil Podlesak kamil.podle...@gmail.com napsal(a):
 Ještě bych doplnil: pokud potřebuji použít finalizér, tak správné
 řešení je použít PhantomReference a speciální vlákno (daemon) které mi
 provádí úklid.

e.p.: Pouzil uz z vas nekdo PhantomReference?

-- 
Oto 'tapik' Buchta, ta...@buchtovi.cz, http://tapikuv.blogspot.com


Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Zdenek Tronicek
V navaznosti na tuto diskuzi bych rad poznamenal, ze jednim z navrhu na
vylepseni Javy je Automatic Resource Management. Misto

static String readFirstLineFromFile(String path) throws IOException {

BufferedReader br = new BufferedReader(new FileReader(path));

try {

return br.readLine();

} finally {

br.close();

}

}

bychom pak mohli psat

static String readFirstLineFromFile2(String path) throws IOException {

try (BufferedReader br = new BufferedReader(new FileReader(path)) {

   return br.readLine();

}

}

K zavreni streamu br dojde automaticky po opusteni bloku try. Mimochodem,
C# to ma.

Z.T.
-- 
Zdenek Tronicek
FIT CTU in Prague


Filip Jirsák napsal(a):
 Přičemž k těm nejjednodušším programovým konstrukcím patří třeba to, že
 každá funkce dělá právě jednu činnost, a to tu, která je zdokumentovaná.
 Takže například metoda setVisible(boolean) nastavuje viditelnost objektu,
 a
 nesnaží se uhodnou, jestli si programátor náhodou neplete viditelnost s
 existencí.

 Existují programovací jazyky, které se jednoduchosti použití snaží docílit
 tím, že před programátorem spoustu věcí skrývají a snaží se je nějak
 vyřešit
 za něj, ale Java je přesný opak takových jazyků. Java je assembler nad JVM
 a
 její jednoduchost spočívá v tom, že stojí na několika základních
 jednoduchých principech. To ale nemá nic společného s tím, že by se
 překladač nebo běhové prostředí nějak pokoušely uhodnout, co programátor
 chtěl – právě naopak. Nenechte se mást tím, že má Java GC, který něco dělá
 zdánlivě automaticky a bez dohledu uživatele. Za prvé jsou pravidla pro
 programování s tímto typem GC možná jednodušší, než pravidla pro
 programování s explicitní alokací paměti, za druhé ta automatika není mezi
 uživatelským programem a JVM, ale mezi JVM a systémem. Je to asi na stejné
 úrovni, jako je pro nativní programy přerovnávání instrukcí procesorem –
 tedy daleko za hranicí toho, co běžně potřebujete. Pro běžné případy ale
 úplně stačí vědět, že dokud existují na objekt tvrdé odkazy, je objekt
 dostupný a zabírá místo v paměti.

 Jinak je myslím zbytečné dál toto téma rozebírat, buďte rád, že jste se
 něco
 o správě odkazů v Javě dozvěděl už teď při takovéhle jednoduché
 záležitosti
 – třeba při vícevláknovém programování je někdy potřeba vědět o vzniku a
 zániku referencí mnohem podrobněji, protože můžete třeba snadno pracovat s
 objektem, který ještě nebyl zcela vytvořen.

 Filip Jirsák

 Lepsi kdyz to studuje expert, nez amater. Nakonec expert by to mozna
 napsal lepe v C++. Proto je Java tak oblibena, ze se v ni chyb da
 delat mene a jsou snadneji odhalitelne.

 Situace je jina, pokud mate aplikaci, kterou od zacatku do konce
 vyvijite sam nebo aspon nad vyvojem mate dohled. V beznem zivote ale
 na vas spadne existujici aplikace (nebo lepe nekolik aplikaci), na
 ktere se behem radu let vystridala rada lidi s ruznym stupnem znalosti
 Javy, Swingu (a pripadne hafo dalsich knihoven). Pak jste vdecny za co
 nejjednodussi programove konstrukce, ve kterych nelze udelat chyba.




Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Ladislav Thon
 V navaznosti na tuto diskuzi bych rad poznamenal, ze jednim z navrhu na
 vylepseni Javy je Automatic Resource Management.


Je to jeden z akceptovaných návrhů Project Coin:
http://wikis.sun.com/display/ProjectCoin/2009ProposalsTOC, takže by se to
mělo objevit v Javě 7. A já volám, když už nebyly vyslyšeny moje modlitby
stran lexikálních uzávěrů: sláva! Sláva!

Mimochodem, C# má spoustu věcí, které Javě IMHO chybí. A Groovy ostatně
taky. To jen když už jsme se pustili do těžce off-topic témat :-)

LT


Re: Swing a uvolnovani Window

2010-01-26 Tema obsahu Zdenek Tronicek
Tak to byly Tvoje modlitby :-). A ja si porad lamal hlavu, co primelo
Marka Reinholda, aby zmenil nazor na closures a zahrnul je do JDK 7.
Po jeho oznameni na Devoxxu je velmi pravdepodobne, ze closures budou. Jen
se zatim nevi, jak budou vypadat.

Mozna takto:

#int(String) strLen = #(String s) {
 if (s == null) return -1;
 return s.length();
  };

nebo takto:

#(String: int) strLen = #(String s: int length) label:{
if (s == null) { length =-1; break label; }
length = s.length();
  };

nebo treba i takto:

#(String: int) strLen = #int(String s) length: {
if (s == null) break length =-1;
length = s.length();
  };

a nebo uplne jinak.

Z.T.
-- 
Zdenek Tronicek
FIT CTU in Prague


Ladislav Thon napsal(a):
 V navaznosti na tuto diskuzi bych rad poznamenal, ze jednim z navrhu na
vylepseni Javy je Automatic Resource Management.
 Je to jeden z akceptovaných návrhů Project Coin:
 http://wikis.sun.com/display/ProjectCoin/2009ProposalsTOC, takže by se
to
 mělo objevit v Javě 7. A já volám, když už nebyly vyslyšeny moje
modlitby
 stran lexikálních uzávěrů: sláva! Sláva!
 Mimochodem, C# má spoustu věcí, které Javě IMHO chybí. A Groovy ostatně
taky. To jen když už jsme se pustili do těžce off-topic témat :-) LT