2013-03-05 38 views
8

Tôi có một ứng dụng JavaFX để khởi tạo một số đối tượng Task.JavaFX - đang đợi tác vụ hoàn thành

Hiện tại, triển khai của tôi (xem bên dưới) gọi hành vi runFactory() thực hiện tính toán trong đối tượng Tác vụ. Song song với điều này, nextFunction() được gọi. Có cách nào để có nextFunction() "wait" cho đến khi nhiệm vụ trước đó hoàn tất?

Tôi hiểu thread.join() đợi cho đến khi luồng đang chạy hoàn tất, nhưng với GUI, có thêm các lớp phức tạp do chuỗi gửi sự kiện. Thực tế, việc thêm thread.join() vào cuối đoạn mã dưới đây chỉ chấm dứt tương tác giao diện người dùng.

Nếu có bất cứ đề nghị làm thế nào để làm cho nextFunction chờ đợi cho đến khi chức năng trước đây của nó, runFactory hoàn tất, tôi sẽ rất biết ơn.

Cảm ơn,

// 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(); 
} 

Trả lời

19

Khi sử dụng Công việc bạn cần phải sử dụng setOnSucceeded và có thể setOnFailed để tạo ra một dòng chảy logic trong chương trình của bạn, tôi đề nghị rằng bạn cũng làm runFactory() trở lại nhiệm vụ chứ không phải là chạy nó:

// 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

Màn hình, tôi thích logic của bạn ... cảm ơn bạn. Nó có ý nghĩa hoàn hảo. –

+0

Giải pháp này có hiệu quả. Điều đó nói rằng, lợi thế của phương pháp này như thế nào trái ngược với việc làm một cái gì đó như 'Platform.runLater (nextFunction())' là bước cuối cùng trong chuỗi nhà máy? – Vultan

+0

Cảm ơn một triệu, setOnFailed() đã lưu tôi sau hai ngày đấu tranh – Yahya

Các vấn đề liên quan