2013-03-05 12 views
8

Ho un'applicazione JavaFX che istanzia diversi oggetti Task.JavaFX - in attesa del completamento dell'operazione

Attualmente la mia implementazione (vedere di seguito) chiama il comportamento runFactory() che esegue il calcolo in un oggetto Task. Parallelamente a questo, nextFunction() viene richiamato. C'è un modo per avere nextFunction() "wait" fino al completamento della precedente Task?

Capisco thread.join() attende fino a quando il thread in esecuzione è completo, ma con le GUI, ci sono ulteriori livelli di complessità dovuti al thread di invio dell'evento. Di fatto, l'aggiunta di thread.join() alla fine del segmento di codice seguente interrompe solo l'interazione dell'interfaccia utente.

Se ci sono suggerimenti su come rendere nextFunction attendere che la sua funzione preventiva, runFactory è completa, sarei molto riconoscente.

Grazie,

// High-level class to run the Knuth-Morris-Pratt algorithm. 
public class AlignmentFactory { 
    public void perform() { 
     KnuthMorrisPrattFactory factory = new KnuthMorrisPrattFactory(); 
     factory.runFactory(); // nextFunction invoked w/out runFactory finishing. 
     // Code to run once runFactory() is complete. 
     nextFunction() // also invokes a Task. 
     ... 
    } 
} 

// Implementation of Knuth-Morris-Pratt given a list of words and a sub-string. 
public class KnuthMorrisPratt { 
    public void runFactory() throws InterruptedException { 
     Thread thread = null; 
     Task<Void> task = new Task<Void>() { 

      @Override public Void call() throws InterruptedException { 
      for (InputSequence seq: getSequences) { 
       KnuthMorrisPratt kmp = new KnuthMorrisPratt(seq, substring); 
       kmp.align(); 

      } 
      return null; 
     } 
    }; 
    thread = new Thread(task); 
    thread.setDaemon(true); 
    thread.start(); 
} 

risposta

19

Quando si utilizza attività da utilizzare setOnSucceeded ed eventualmente setOnFailed per creare un flusso logico nel programma, propongo che anche voi fate runFactory() ritorno il compito invece di eseguirlo:

// Implementation of Knuth-Morris-Pratt given a list of words and a sub-string. 
public class KnuthMorrisPratt { 
    public Task<Void> runFactory() throws InterruptedException { 
     return new Task<Void>() { 

     @Override public Void call() throws InterruptedException { 
     for (InputSequence seq: getSequences) { 
     KnuthMorrisPratt kmp = new KnuthMorrisPratt(seq, substring); 
     kmp.align(); 

     } 
     return null; 
    } 
    }; 
} 

// High-level class to run the Knuth-Morris-Pratt algorithm. 
public class AlignmentFactory { 
    public void perform() { 
    KnuthMorrisPrattFactory factory = new KnuthMorrisPrattFactory(); 
    Task<Void> runFactoryTask = factory.runFactory(); 
    runFactoryTask.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
     @Override 
     public void handle(WorkerStateEvent t) 
     { 
      // Code to run once runFactory() is completed **successfully** 
      nextFunction() // also invokes a Task. 
     } 
    }); 

    runFactoryTask.setOnFailed(new EventHandler<WorkerStateEvent>() { 
     @Override 
     public void handle(WorkerStateEvent t) 
     { 
      // Code to run once runFactory() **fails** 
     } 
    }); 
    new Thread(runFactoryTask).start(); 
    } 
} 
+0

Dreen, mi piace la tua logica ... grazie. Ha perfettamente senso. –

+0

Questa soluzione sembra efficace. Detto questo, qual è il vantaggio di questo approccio piuttosto che fare qualcosa come "Platform.runLater (nextFunction())" come ultimo passaggio del thread di fabbrica? – Vultan

+0

Grazie a un milione, setOnFailed() mi ha salvato dopo due giorni di difficoltà – Yahya

Problemi correlati