2016-11-12 123 views
2

我想問一下如何設計應用程序的建議。目前,我想重寫一個統計應用程序將大數據處理成多線程版本。我的主要語言是C++,對於我的稍微初學者的問題抱歉:-)。Java,多線程應用程序,運行時的主窗口

現有的應用程序基於以下模型。有一個MainWindow類持續顯示涉及當前縮放操作(GUI)的先前結果。每一次統計計算都是基於自己的課程來獲取輸入數據,執行計算,顯示結果及其可視化(基於揮杆)。

不幸的是,庫不是寫成多線程的。它有一個不希望的後果:在計算運行時,不可能使用MainWindow(瀏覽所有結果直到獲得新的結果);它被「凍結」 ......

昨天,我試圖提出一個概念上的更新:

public class MainWindow extends JFame { 

private void fButtonActionPerformed(java.awt.event.ActionEvent e) { 
    //Get data, single thread 
    Matrix A = getData(); //Input data (block matrix) 
    Matrix B;    //Output data (block matrix) 

    //Computation in a separate thread 
    FunctionMT f = new FunctionMT (A, B); 
    Thread t = new Thread(f); 
    t.start(); // Starting the thread 

    //Display results in a form 
    results.print(B); 

    //Update graphic results 
    scene.update(B); 
    scene.repaint(); 
} 

樣本函數類FunctionMT擴展線程庫

public class FunctionMT extends Thread{ 
    private final Matrix A; 
    private Matrix B; 

    public FunctionMT (final Matrix A_, Matrix B_) {A = A_; B = B_;} 
    public void run() { spDecomposition();} 
    public void spDecomposition() { 
     for (int i = 0; i < A.size; i++) 
      for (int j = 0; j < A.size; j++) 
       B(i,j) = f(A(i,));} //Some computationally hard step 
}  

矩陣A是輸入矩陣,B代表輸出。計算是在一個使用FunctionMT實例的單線程中執行的...

當計算在單個線程中運行時,可以使用主窗口。不幸的是,結果在計算停止前被重新繪製。

我嘗試添加該等待,直到結果processed.Unfortunately,它使凍結的主窗口中的連接方法()

... 
Thread t = new Thread(f); 
t.start(); // Starting the thread 

try{t.join();} //Wait for its end 
catch(InterruptedException e) {e.printStackTrace();} 

results.print(B); 

scene.update(B); 
scene.repaint(); 
... 

如何提出一個多線程計算,以便能夠在計算過程中使用主窗口以及表單等待計算完成?

是否可以添加一些函數來處理系統消息進入循環?

for (int i = 0; i < A.size; i++) 
    for (int j = 0; j < A.size; j++) 
      processSystemMessages(); 
      B(i,j) = f(A(i,));} 

另一種解決方案可以加入計算算法和顯示結果到同一個線程,但它看起來醜陋:-)並打破了設計模式。

非常感謝您的幫助...

回答

2

試試這個:

UPDATE:鬆耦合

public class MainWindow extends JFrame { 

    private void fButtonActionPerformed(java.awt.event.ActionEvent e) { 

     // ... 

     FunctionMT f = new FunctionMT (A, B, new Runnable() { 
      @Override 
      public void run() { 
       results.print(B); 
       scene.update(B); 
       scene.repaint(); 
      } 
     }); 
     Thread t = new Thread(f); 
     t.start(); 

     // Wait for computation: 
     // won't do it here. 
     // results.print(B); 
     // scene.update(B); 
     // scene.repaint(); 
    } 
} 
public class FunctionMT extends Runnable { 

    // ... 

    private Runnable callback; 

    public FunctionMT (final Matrix A_, Matrix B_, Runnable callback) { 

     // ... 

     this.callback = callback; 
    } 

    private void spDecomposition() { 

     // Do computation. 

     SwingUtilities.invokeLater(callback); 
    } 
} 
+0

@ nandsito:感謝您的評論。問題在於計算,打印結果和更新場景都被連接到相同的線程和方法。它導致對類FunctionMT的巨大重新定義(引用表單,圖形對象等)。不幸的是,它打破了設計模式... – justik

+0

@justik你的擔心是合法的。我更新了我的答案,請看看它是否適合您的需求 – nandsito

+0

@ nandsito:感謝您的更新解決方案,將嘗試... – justik

相關問題