Helló,
egy kérdésem volna Javaval kapcsolatban. Egy töbszálu progit írok amiben egyik szál beolvas valamit egy fileból egy streambe, a másik szál meg kiolvassa azt innen és földolgozza az datokat. A kérdés az hogyha a beolvasó szálban kivétel keletkezik akkor azt hogy tudom továbbdobni a másik szálnak? (Ugyebár a run() miatt nem lehet a throws-al.)
Előre is köszi a segítséget.
- 1615 megtekintés
Hozzászólások
Szerintem csak úgy, hogy csinálsz egy olvasó által időnként nézegetett ojjektum referenciát egy Throwable-re (valahova). Azt beállítod a dobott kivételre, az olvasóban meg megnézed, és ha van ott kivétel, akkor azt dobta az író fél.
Ez egy nem túl szép megoldás volna. Ahhoz, hogy szebbet mondjak kellene ismerni a pontos szituációt.
Az sem világos, hogy minek külön szálon olvasni a fájlból a streambe. És a stream micsoda? Egy FIFO memóriában, vagy mi?
- A hozzászóláshoz be kell jelentkezni
Ez egy szteganográfiás progi. Az olvasó szál dekódolja a szteganográfiás adatokat. De ez az eljárás ugyebár képformátumonként külömbözik, ezért ezt arészt tulajdonképpen tekinhetjük drivernek is. A program többi része mnem tud semmit arról hogy milyen képből olvasunk ki az adatokat az csak a már dekódolt adatokat kapja vissza a steram másik felén. Azért kell a drivernek külön szálban futni a mert a visszakapott adatok egy része fájl egy része megyjegyzés egy része meg a "tartalomjegyzék" de erről pedig a driver nem tud semmit, ezt a fölsőbb rétegek választják szét.
Röviden ez a progi amit írok.
Igen FIFO szerűséget használok a driver egy input streamból olvassa illetve egy outputstreamba írja az adatokat, a fölsőbb rétegen pedig pipedstream-mekkel oldom meg hogy mondjuk az outputstreamból amibe a driver ír ki tudjam olvasni az adatokat.
- A hozzászóláshoz be kell jelentkezni
az nem világos hogy miért külön szál dekodolja a szteganográfiás adatokat, egy streamen keresztül és miért nem egy az inputstreamből származtatott osztály?
- A hozzászóláshoz be kell jelentkezni
Igen lehet logikus lenne az enkódolót és a dekódolót Stream alosztályként megírni, ésn is gondoltam már rá de egyenlőre nem így csinálom. Lehet késöbb megcsinálom streamként is ezeket.
- A hozzászóláshoz be kell jelentkezni
Utánanéztem mi az a szteganográfia.
Valahol azt írták: "Terroristák eszköze" :-)
- A hozzászóláshoz be kell jelentkezni
Utánanéztem mi az a szteganográfia.
Valahol azt írták: "Terroristák eszköze" :-)
- A hozzászóláshoz be kell jelentkezni
:) I am not terrorist.
Tanenbaum könyvébe olvastam a dolgoról innen jött az ötlet. Lehet ő terrorista??? :D
- A hozzászóláshoz be kell jelentkezni
ja tudom:
- Vannak itt terroristák?
- Van, egy, a kántorunk, de már ő sem a régi, már ő is mikrofonba énekel.
:D
--
hup.user.js
- A hozzászóláshoz be kell jelentkezni
:D
- A hozzászóláshoz be kell jelentkezni
Találtam egy megoldást, ha Callable-ként valósítom meg akkor tudok return értéket is visszaadni és kivételt is dobni.
Csak azt nem értem hogy hol tudom megnézni hogy dobott-e kivételt a szálban futó metódus?
Ha valaki tudja légyszi írja meg. Előre is köszi.
- A hozzászóláshoz be kell jelentkezni
Guglival:
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Future.html
Tehát: egy ExecutorService-nek a submit metódusával indítod el a száladat. Ez egy Future objektumot fog visszaadni, aminek a fenti oldalon látható metódusai vannak. Az isDone metódussal le tudod kérdezni, hogy mi a helyzet, fut-e még a szál. Ha nem, akkor lekérdezed a get-tel az értékét, ami az lesz, amit visszaadott a callable, vagy dob egy szép(?) exceptiont. Pontosan azt, amit benne dobott a te kódod. Ha nem kérdezed le isDone-nal, hogy fut-e, akkor ha történetesen fut, akkor blokkolódni fog a szál, amin a get-et hívod addig, amig be nem fejeződik a másik.
Kb így lehet használni a java.util.concurrent apit használva. bár még mindig nem világos, hogy miért kell ilyen cuccot két külön szálra rakni. Hacsak nem többmagos processzorra optimalizálsz, bár akkor is értelmesebb inkább két külön képre futtatni az elemzést 1Xre, mint egy elemzést két procira rakni. Mivel a FIFO miatt csomót fog szinkronizálni a két szál.
- A hozzászóláshoz be kell jelentkezni
Köszönöm a segítséget. Én is olvastam az oldalt de ezek szerint félre értettem mert én azt hittem hogy csak az a pár fajta kivételt tudja dobni ami ott föl van sorolva.
- A hozzászóláshoz be kell jelentkezni
valójában csak azt a három félét dobja, viszont ha executionexception jön, akkor annak ez okát a getCause-zal le lehet kérdezni. Ez is benne van a doksiban.
- A hozzászóláshoz be kell jelentkezni
Lenne nekem is egy kerdesem.
Adott egy NetBeans alatt osszehozott GUI form, ami a main fuggvenyben elindul, de elotte deklaralva van mar. Van rajta tobbek kozott egy jMessageBox nevu textarea. Ha ennek a jMessageBox-nak a konstruktorban az initcomponents() utan megadom, hogy jMessageBox.append("valami szoveg"), akkor gond nelkul megy, de viszont
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
mw=new MainWindow();
mw.setVisible(true);
mw.jMessageBox.append("Akarmi"); // < Itt semmi nem tortenik
}
}
Es ez a bajom, hogy innentol mintha teljesen suket volna, semmi sem tortenik. Ha masik osztalybol hivom meg MainWindow.mw.jMessageBox.append("valami")-vel, akkor meg NullPointerException-t ad. Tuti en vagyok a lamer, de nem ertem :(
---
Hey! Where'd my terminal go?
- A hozzászóláshoz be kell jelentkezni
Szia!
Ennyiből elég nehéz kitalálni mi a baj.
Ami ilyenkor a trükk: a .-tal szétválasztott sort több külön sorba kell tördelni, akkor kiderül, hogy melyik változó inicializálatlan (azaz null). Azonkívül az sem világos, hogy ez a sor dobja, vagy a meghívott metódusból jön a nullptrexc. A stacktrace sokat segítene...
Vagy nem állítod be a változót, vagy másik szálon később, vagy akármi más. 1000 oka lehet.
Amúgy nem világos az sem, hogy az invokelater blokkba minek kellett betenni a cuccot (persze attól még lehet, hogy be kell). Mindenesetre a runnable-k úgy vannak kitalálva, hogy nem dobnak exceptiont, tehát illik benne mindent lekezelni (runtimeexceptiönöket) és logolni, mert egyébként ki tudja hova fog kiíródni ami történik.
- A hozzászóláshoz be kell jelentkezni
Kozben meglett a hiba. A Main.java-bol volt meghivva mar a new MainWindow().setVisible(true), tehat az mw valtozo nem inicializalodott soha. Es azert nem tortent semmi, mert a MainWindow.java-ban a main fuggveny meg sem hivodott sehol...
---
Hey! Where'd my terminal go?
- A hozzászóláshoz be kell jelentkezni
Meg egy kerdes:
Adott egy JTabbedPane; ehhez kellene hozzaadni tabokat, a tabokba pl. egy JTextArea. Hogy tudok en egy hatterben levo tabnak a textarea-jara irni? chat programot szeretnek irni :)
---
Hey! Where'd my terminal go?
- A hozzászóláshoz be kell jelentkezni
Szerintem attól függetlenül, hogy éppen látszik-e vagy sem minden metódusa ugyanúgy működik, mint amikor látszik. Ugyanúgy írsz a text mezőbe.
- A hozzászóláshoz be kell jelentkezni
Az a baj, hogy:
pl. jon neked egy privat uzenet, es a nick-kel, aki kuldte megnyit egy tabot, de x szamu masik userre is megnyit egy tabot. Mindegyik tabon lesz egy JTextArea, de ezeknek a neve ugyanaz lesz minden tabon, mert nem tudom megcsinalni, hogy a valtozo neve a nick-tol fuggoen valtozzon. Vagy tudsz erre modszert? (Tudom, lamer vagyok...). En arra gondoltam, hogy csinalok egy dinamikusan valtozo string matrixot, es ebbe irogatom az uzeneteket, ami nem az eppen lathato tabra megy, es pl. megnyitom a tabot, ha nincs olyan tab, es a cime melle teszek egy csillagot. Amikor rakattint az adott tab-ra, es aktivalodik a ful, amelyre uzenet erkezett, akkor bevagna a string matrixbol az adott oszlopot :)
---
Hey! Where'd my terminal go?
- A hozzászóláshoz be kell jelentkezni