Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich versuche mich grad an einem Thread und steige nicht durch die Javainsel etc durch.
Ich möchte von einem JDialog aus einen neuen Thread starten. Der Thread soll in einer anderen Klasse eine Funktion aufrufen, die ein 2D-Array zurückliefert. Das ist das erste Problem. Wie liefert ein Thread etwas zurück? Gleichzeitig soll in dem Dialog noch ein Fortschrittsbalken angezeigt werden, der den Fortschritt aus der Funktion anzeigt. Wie kann ich das machen?
Zu Fortschrittsbalken und Threads steht was in den FAQ. Das Zurückliefern eines Arrays ist so unmittelbar aber nicht möglich - außer, Wenn du einen Modalen Dialog aufmachst. Wer soll denn ansonsten darauf warten, dass der Thread fertig ist? Man müßte andernfalls den Array, den der Thread erstellt, irgendwo speichern...
du willst einen neuen Diolog in einem Thread starten? keine gute idee. Starte lieber deine rechenintensiven in einem extra Thread, damit die GUI nicht blockiert.
Ich möchte von einem JDialog aus einen neuen Thread starten.
-> du willst einen neuen Diolog in einem Thread starten?
Also, ich denke es geht um irgendeinen Dialog mit sowas wie einem "Berechnung starten"-Button - und nachdem der geklickt wurde, soll (in einem Weiteren Dialog oder so) eine ProgressBar erscheinen. Aber was soll dann mit dem berechneten Array passieren?
Ein Thread gibt nichts zurück im Sinne von "return", ein Thread startet und terminiert in der run()-Methode, deren Rückgabewert void ist.
Wenn du möchtest dass der Fortschritt an den ürsprünglichen Thread gegeben wird, nutzt du am besten das Observer-Pattern:
public class MainProgram implements Observer{}
public class MyThread extends Observable implements Runnable
Nun gibt es in dem Haupt-Programm eine Methode "update"
(bzw diese musst du überschreiben). Diese Methode wird
aufgerufen wenn du in deiner MyThread-Klasse folgendes aufrufst:
Bei notifyObservers kann man noch ein Object als Parameter übergeben.
Du übergibst da dein 2d-array. In der update-Methode des Haupt-
Programms kannst du das dann nutzen:
update(Observer o, Object obj){
// obj ist jetzt das 2d-array
}
Das heisst angenommen dein MyThread befüllt ein 2d-array, dann kannst du nach jedem
neuen eingefügten Element setChanged() und notifyObservers() aufrufen, und in der update()
machst du dann sowas wie:
Code:
// PSEUDO-CODE !!
int[][] 2d = (int[][]) obj; // casten
int anzahlBefüllt = calculateBefüllteFelder(2d);
int anzahlTotal = 2d.length;
dialog.showProgress(anzahlBefüllt + " of " +anzahlTotal);
..und damit sonst was machen, zB es grafisch darstellen.
Das wäre halt die Variante, wenn dein Haupt-Programm etwas
darstellen soll und dein Thread nur rechnen.
Natürlich brauchst du das ganze Observer-Pattern nicht, wenn
du gleich innerhalb der run()-Methode deines Threads alles machst.
Wie mein Vorredner aber sagte: Swing/AWT-Elemente
(wie zB ein JDialog) vertragen sich schlecht mit Threads, weil sie
in einem eigenen Thread laufen.
Suche dafür hier/Google mal nach "EventQueue" oder "SwingUtilities"
oder - am besten - nach "Event Dispatch Thread".
Öh keine Ahnung. Also die Observer-Methoden gibt es ja nur mit Object.
Fand es schon immer wünschenswert, dass man gleich beim registrieren sagen
kann, was überhaupt beobachtet werden soll:
t.addObserver(this,int[][] anArray);
die update-Methode könnte während der Laufzeit so definiert werden:
update(int[][] anArray){
..
}
Irgendwie müsste man da ein System einbauen, dass sich die update-Methode
eines jeden Observers ihr "Ziel-Objekt" aus dem Object, dass bei notifyObservers() übergeben wird, rauszieht.
@Andrey: Mit dem SwingWorker kann man das generisch und Typsicher machen, allerdings ist der in erster Linie dafür da, die (Zwischen)ergebisse wieder ins GUI zurückzuschaufeln (und DAS dann eben im Event-Dispatch-Thread). Deswegen hab ich auch schon (ein paar mal ) gefragt, WER auf die Ergebnisse warten soll, und WAS danach mit dem Array gemacht werden soll. Aber offenbar hat sich der Threadersteller (sic! ) schon aus diesem Thread (sic!) ausgeklinkt....
OT: Ist dieses "sic!" auch das, was immer die Amerikaner sagen nachdem sie einen dummen Witz gemacht haben? Ich wollte schon immer wissen was das ist.
Klang für mich bisher immer so nach "Psych'". Was heisst das denn?
Eigentlich verwendet man das zur Kenzeichnung dafür, dass man etwas Zitiert, und dabei einen Fehler übernimmt, den der Zitierte gemacht hat. Da das aber nur eine Interpretation ist, und nicht unbedingt etwas mit der eigentlichen Bedeutung des Wortes zu tun hat, war es hier nur gedacht, um die Doppeldeutigkeit der Worte "Threadersteller" und "Thread" (in bezug auf Java-Programmierung und ein Forum) hervorzuheben. Siehe auch http://de.wikipedia.org/wiki/Sic