The Hoff Skrevet 17. juli 2009 Skrevet 17. juli 2009 Hei, Lager en trelagsapplikasjon som mer eller mindre skal fungere som en pakkesniffer. Dvs. når jeg trykker på en "receive"-knapp skal applikasjonen begynne å lytte på en serieport. Hver gang det kommer noe input, som det gjør ca. hvert tyvende sekund skal denne inputen returneres og skrives til et TextArea(TextArea.append(String string)). Problemet er at det ikke skjer noe i GUIet. Det står i javadocen til TextArea.append(String str) at den er "Thread Safe". Hva vil det si? Noen som forstår problemet mitt? Kom gjerne med tips til hvordan problemet skal løses.
Wattengård Skrevet 17. juli 2009 Skrevet 17. juli 2009 Thread-safe betyr vel at programmet ikke kræsjer hvis du prøver å skrive til den ifra en annen tråd. Uten å være helt sikker så kan jeg anta at det som skjer er at du kjører sniffingen i samme tråd som gui'et. Derfor skjer ingen oppdateringer. Får du ikke til å benytte bufring på serieporten slik at du kan lese fra den hvert 2. sekund og få det som har inkommet til da? Evt får du trekke ut selve sniffingen i en egen tråd. -C-
___ Skrevet 17. juli 2009 Skrevet 17. juli 2009 Hei, Lager en trelagsapplikasjon som mer eller mindre skal fungere som en pakkesniffer. Dvs. når jeg trykker på en "receive"-knapp skal applikasjonen begynne å lytte på en serieport. Hver gang det kommer noe input, som det gjør ca. hvert tyvende sekund skal denne inputen returneres og skrives til et TextArea(TextArea.append(String string)). Problemet er at det ikke skjer noe i GUIet. Det står i javadocen til TextArea.append(String str) at den er "Thread Safe". Hva vil det si? Noen som forstår problemet mitt? Kom gjerne med tips til hvordan problemet skal løses. Sjekk ut SwingWorker-klassen. Den benytter jeg i lignende situasjoner som den du beskriver. http://java.sun.com/docs/books/tutorial/ui...ncy/worker.html Werner
The Hoff Skrevet 21. juli 2009 Forfatter Skrevet 21. juli 2009 (endret) Hei, Lager en trelagsapplikasjon som mer eller mindre skal fungere som en pakkesniffer. Dvs. når jeg trykker på en "receive"-knapp skal applikasjonen begynne å lytte på en serieport. Hver gang det kommer noe input, som det gjør ca. hvert tyvende sekund skal denne inputen returneres og skrives til et TextArea(TextArea.append(String string)). Problemet er at det ikke skjer noe i GUIet. Det står i javadocen til TextArea.append(String str) at den er "Thread Safe". Hva vil det si? Noen som forstår problemet mitt? Kom gjerne med tips til hvordan problemet skal løses. Sjekk ut SwingWorker-klassen. Den benytter jeg i lignende situasjoner som den du beskriver. http://java.sun.com/docs/books/tutorial/ui...ncy/worker.html Werner Takk for tips. Jeg har nå kommet et skritt nærmere. Om metoden "doInBackground()": Note that this method is executed only once. Første gang jeg klikker på "resetButton" (se kode under) fungerer det knirkefritt, men de påfølgende gangene skjer det ingenting. Hvordan kan jeg få til dette? Her er min kode: SwingWorker<String,String> swingWorker = new SwingWorker<String,String>(){ protected String doInBackground() { SoftwareReset swReset = new SoftwareReset(getSerialPortConnection().getSerialPort()); String tx = swReset.getOutputCommand(); publish(tx); String rx = swReset.zb_SystemReset(); return rx; } protected void process(List<String> chunks){ System.out.println("I process"); txTextArea.append("Outgoing:\n"); for(String str:chunks){ txTextArea.append(str); } } public void done(){ try { rxTextArea.append("Incoming:\n"+get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } if(this.isDone()){ try { this.finalize(); } catch (Throwable e) { e.printStackTrace(); } this.cancel(true); } } }; private void resetButtonActionPerformed(java.awt.event.ActionEvent evt) { swingWorker.execute(); } Endret 21. juli 2009 av String-Emil
Patton Skrevet 21. juli 2009 Skrevet 21. juli 2009 En instans av SwingWorker kan bare utføres én gang. Du må lage en ny instans av SwingWorker for hver gang du vil bruke en.
___ Skrevet 21. juli 2009 Skrevet 21. juli 2009 Dette patternet bruker jeg: new SwingWorker() { @Override protected Object doInBackground() throws Exception { ... return "OK"; } @Override protected void done() { ... } }.execute(); Merk at jeg konstruerer en ny instans av SwingWorker, og kjører den direkte, uten å assigne objektet til en variabel først for så å kjøre det. Werner
The Hoff Skrevet 21. juli 2009 Forfatter Skrevet 21. juli 2009 Fikk det til i stad jeg også, genial sak forresten. Hvorfor definerer du ikke din egen "process"-metode?
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå