Gå til innhold

Problem med oppdatering av GUI


Anbefalte innlegg

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
Videoannonse
Annonse

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
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
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 av String-Emil
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...