Problemstellung : ein Daten-Transport-Programm in Swing , welches per sql Daten von der Datenquelle auf Server 1 in Blöcken à n-Sätzen liest und und diese Blöcke auf Server 2 schreibt :funzt bereits "technisch", aber außer mit System.out.println(<satznr>) bekomme ich keine Positionsanzeige, keine Swing-Komponente wird inhaltsmäßig aktualisiert , z.B. mit JTextField.setText(<satznr>) passiert garnix. Leider scheinen auch andere Komponenten trotz EventListener (z.B. CheckBox zum benutzergesteuerten Terminieren der Kopieraktion) inaktiv zu sein, solange die Kopieraktion (while-Schleife mit Flag-abfrage) am laufen ist.
Bisher wird während der Kopieraktion nur der Mauszeiger verändert, aber man wüßte doch
schon gerne, wieweit (bei hunderttausenden von Datensätzen über mehrere Stunden),
wieweit die Aktion gediehen ist !
Ziel : Prozentanzeige
Weil das nun ein "altes " programm ist aus meinen "Java-Kinderjahren" , ist da auch noch nix
drin mit Threads oder so..muß es wohl komplett neu aufbauen :
Aber wie ?
mit den vielen oft ziemlich theoretischen und oft "praxisfernen" Beiträgen und Beispielen zu "Threads" kann ich bisher nicht allzuviel anfangen, brauche erstmal nen Bauplan : wie sollen welche Klassen womit aufgebaut werden usw....
danke schon mal , "meniskusschaden" : da hab ich erstmal was zum lesen..
wahrscheinlich muß ich auch "zukunftsorientiert" denken, möglicherweise könnte z.B.
bei awt mal was "deprecated" werden ?
sorry, jetzt weiß ich immer noch noch nicht, wo ich was einbauen soll :
also, ich schreib mal "pseudo-code" :
START--------------------------------------------------------
public class transport_functionality :
GUI-Aufbau und Button-Eventhandler , darüber aufrufen der
Funktion transport_data()
Vorbereitung mit Aufruf anderer Funktion
Blockgroesse ist z.B.100
Blockstart-Satznummer = 0
solange kein Fehler UND gelesene Sätze mehr als 0 :
Lies 10 Sätze
Zeige Position an (?)
Schreibe 10 Sätze
Erhöhe Blockstart um Blockgroesse
nach Schleifenende : merken der erreichten kopierten Satzanzahl
ENDE--------------------------------------------------------------
#Ende der Funktion transport_data()
und wo soll jetzt was mit Threads usw rein ? z.B. das mit der Event-Queue ?
Ich vermute mal, dass du die Kopierarbeit im EDT (Event-Dispatcher Thread) erledigst. Swing kommt garnicht dazu, irgendwas zu aktualisieren weil der EDT mit der Kopieraktion beschäftigt ist.
Korrekt. ActionListener#onActionPerformed wird vom EDT aufgerufen. Solange diese Methode läuft, kann der EDT logischerweise nichts anderes machen (z.B. deine GUI aktualisieren).
hab mittlerweile einiges zum swingworker inkl Beispiele durchgelesen..
aber es sind ja immer nur "Inseln" : eine Integration in größere Apps bzw. GUI's
wird nie behandelt bzw bedacht...schade, noch viel Denk- und Testarbeit..
danke erstmal an alle Helferlein und schönes WE !
Eine Integration in größere Apps? Was soll das denn sein? Swingworker ist ein Werkzeug. Dieses zu benutzen wird anhand eines Beispiels erklärt. Wie man es danach benutzt und wo man es einsetzt sollte man schon selber wissen....
Und wenn dir deine App über den kopf gewachsen ist, dann solltest du vielleicht einfach was kleineres machen...
thallius : aua aua warum mußt du gleich so reinhauen ?
mittlerrweile funzt es eben doch, aber wie anfangs gesagt , ist der app-aufbau
nicht so das wahre, aber vor dem neuaufbau wollte ich es erstmal so versuchen..
hätte auch nicht gleich gedacht, daß es mit dem SwingWorker so einfach geht..