The Hoff Skrevet 17. juli 2009 Del 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. Lenke til kommentar
Wattengård Skrevet 17. juli 2009 Del 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- Lenke til kommentar
___ Skrevet 17. juli 2009 Del 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 Lenke til kommentar
The Hoff Skrevet 21. juli 2009 Forfatter Del 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 Lenke til kommentar
Patton Skrevet 21. juli 2009 Del 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. Lenke til kommentar
___ Skrevet 21. juli 2009 Del 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 Lenke til kommentar
The Hoff Skrevet 21. juli 2009 Forfatter Del Skrevet 21. juli 2009 Fikk det til i stad jeg også, genial sak forresten. Hvorfor definerer du ikke din egen "process"-metode? Lenke til kommentar
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å