JavaFX Background Task warten auf Knopfdruck

izoards

Bekanntes Mitglied
Hallo Zusammen,

Ich habe ein FXML GUI, mit einer Controller Klasse. Beim Start der Anwendung wird ein Hintergrund Task gestartet, welcher eine TCP/IP Verbindung aufbaut.
Bei meinen bisherigen Anwendungen wurden bis jetzt die Zeitintensiven Aufgaben jeweils auch vom Hintergrund - Task angestossen. Da konnte ich dann das GUI über Platform Run Later jeweils "steuern" bzw. einfach die Anzeigen machen...
Nun ist es jedoch so, dass der Hintergrund Task nichts machen soll, bis ein Knopf auf dem GUI gedrückt wird.
Wie kann ich nun die Aufgabe vom Controller an den bereits "geöffneten" Hintergrund - Task weiterleiten?
Gibt für den Hintergrund Task sowas wie "Warte bis Knop XY gedrückt wurde" ?

Der Button hat ein Action listener, welcher auch von der Controller Klasse ausgeführt wird. Da die Verarbeitung jedoch länger geht, muss diese vom Hintergrundtask bearbeitet werden. Kann mir jemand helfen, wie ich dies anstellen soll?

Besten Dank....
 
Also "lebt" der Hintergrund - Task (Thread) eigentlich noch, wenn dieser sozusagen, alles abgearbeitet hat? Oder muss ich dann einen neuen Hintergrund - Task starten?
Wie lange sind solche Hintergrundtasks (Threads) am leben? Muss man diese selbst "stoppen"?
Am einfachsten wäre es ja, einfach einen neuen Task zu starten..

Möchte halt vermeiden, dass da Haufenweise Tasks (Threads?) offen sind, welche nicht geschlossen sind...
(Hoffe Ihr wisst was ich meine) 🙈
 
Also ein Thread "lebt" so lange, bis die aufgerufene Methode (z.B. bei Ableitung die run Methode) sich beendet.
Wenn ein Thread beendet ist, dann musst du einen neuen erstellen. Man kann Threads nicht erneut starten.

Du kannst in einem Thread durchaus "warten". Das geht sowohl aktiv als auch passiv. Ein aktives warten wäre, dass Du z.B in einer Schleife eine Variable prüfst und wenn die noch nicht den gewünschten Wert hat, dann machst Du ein Thread.sleep um kurz zu warten. Ein passives Warten wäre, dass Du mit wait wartest, bis du per notify geweckt wirst.

Das ist aber etwas, das vermutlich für Deine Fälle einfach zu komplex ist. Du solltest einfach mit Threads arbeiten und wenn dann der Knopf gedrückt wird, schaust Du, ob Du einen Thread starten kannst (Falls es da Abhängigkeiten gibt. Evtl. darf nur ein Thread laufen oder es muss eine andere Bedingung erfüllt sein) und dann erstellst und startest Du den Thread.
 
Hallo kneitzel, herzlichen Dank für deine Antwort.

Noch für mein Verständnis, bis jetzt habe ich die "Threads" wie folgt gestartet:

Java:
public class RunnerService extends Service<Void> {

    private MainWindowController controller;
    private TCPClient client;


    public RunnerService(MainWindowController controller, TCPClient client) {
        this.controller = controller;
        this.client = client;

    }

    @Override
    protected Task<Void> createTask() {
        return new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                System.out.println("Background task started...");
                My_Loader runnerApp = new My_Loader(controller, client);
                runnerApp.start();
                return null;
            }
        };
    }
}

Das ist schon ein Thread, oder ist das wieder was anderes? 🙈

Das würde dann bedeuten, wenn die Methode "start" aus der Klasse runnerApp abgelaufen ist, ist dieser "Thread" beendet?

Ist es denn richtig, dass ich für jeden "Thread" eine neue solche Klasse mache?
Oder kann dies eleganter gelöst werden?
 
Also der Thread ist beendet, wenn die call() Methode zurück geht (return null; in Zeile 21).

Bezüglich der Strukturierung kann ich erst einmal nichts sagen. Die Frage ist, was die Threads alle machen sollen. Dann kann man entscheiden, ob das Tasks sein sollen oder ob man da direkt Threads / Runnable nutzt oder oder oder ... Java und JavaFX bieten einiges an Möglichkeiten und viele Wege führen zum Ziel.
 

Neue Themen


Zurück
Oben