SWT SWT - Threading / Callback

Status
Nicht offen für weitere Antworten.

matthias81

Neues Mitglied
Hallo Community,
Ich habe eine Methode, die über asyncExec eine andere Funktion über ein Runnable ausführt, um Daten aus einem Browser Control (JavaScript) auszulesen:

Der Code lautet wie folgt (vereinfacht):

Java:
private static String result;
public static String getValue(final int value)
{
    Display.getCurrent().asyncExec(new Runnable() {
         public void run() {
             getValueFromBrowser(value, new MyCallback(){
                public void ok(String s) {
                    result = s;
                }
                public void error() {
                    result = "error";
                }						
              });
          }
    });
    // HIER warten auf Ende von ok bzw. error
    return result;
}
Das Ergebnis (result) kann in der methode "ok" korrekt auf der konsole ausgegeben werden.
Mein Problem ist jedoch, dass die Funktion in diesem Fall sofort zurückspringt und nicht darauf wartet, bis der richtige Wert für result in ok bzw. error zugewiesen wurde.

Weiss jemand, wie ich hier ein entsprechendes Wartekonstrukt implementieren kann??
Warten in einer Schleife mit Thread.sleep(x) funktioniert in diesem Fall ja nicht, da somit auch die AUsführung des Runnable blockiert wird.

Da ich in der Methode getValueFromBrowser auf das BrowserControl zugreifen muss, kann ich jedoch auch keinen eigenen Thread erstellen, sondern muss die Methode als UI Thread ausführen (liege ich da richtig?)

Weiss jemand, wie ich das bewerkstelligen könnte?
Danke im Voraus!

mfg matthias
 
Zuletzt bearbeitet:

matthias81

Neues Mitglied
Hallo Wildcard,

Habe folgende Beschreibung gefunden:
syncExec(Runnable runnable): In addition to causing the argument to be run by the user interface thread of the display, this method causes the current thread (if it is different than the user interface thread of the display) to wait for the runnable to finish.

Aus diesem Grund habe ich auch versucht, die Methode getValue in einem eigenen Thread aufzurufen und anschließend auf das Ende zu warten:
Java:
Thread t = new Thread(new Runnable(){
                  @Override
        	     public void run() {
                      getValue(20);
	     }
	});
t.start();
try {t.join(); } catch(InterruptedException ex) { }

Nun wird jedoch weder das Ende von "getValue" noch eine der inneren Methoden (ok/error) erreicht.
Das Programm hängt und reagiert nicht mehr..

Hast du sonst noch irgendwelche Ideen?

Danke,

mfg matthias
 

Wildcard

Top Contributor
syncExec tut genau das was du haben wolltest. Die Ausführung in den UI Thread verlagern und auf das Ende warten.
Der einzige Fall in dem es nicht funktionieren würde ist, wenn getValueFromBrowser nochmal irgendwelche Threads spawnt, aber dann macht das ganze Konstrukt so keinen Sinn und du musst genauer beschreiben was da vor sich geht und was du haben möchtest.
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben