2016-11-12 15 views
2

Я хотел бы попросить совета, как разработать приложение. В настоящее время я хотел бы переписать статистическое приложение, обрабатывающее большие данные в многопоточную версию. Мой основной язык - C++, извините за мой слегка начинающий вопрос :-).Java, многопоточное приложение, рабочее главное окно при вычислении

Существующее приложение основано на следующей модели. Существует класс MainWindow, который непрерывно отображает предыдущие результаты, связанные с текущей операцией масштабирования (GUI). Каждое статистическое вычисление основано на собственном классе, собирающем входные данные, выполнении вычислений, показе результатов и их визуализации (на основе swing).

К сожалению, библиотека не написана как многопоточная. Это имеет нежелательные последствия: пока выполняется вычисление, невозможно работать с 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 
}  

матрица А является входная матрица, B представляет выход. Вычисление выполняется в одном потоке, работающем с экземпляром FunctionMT ...

Когда вычисление выполняется в одном потоке, можно работать с основным окном. К сожалению, результаты перекрашиваются до того, как вычисление будет остановлено.

Я пытался добавить метод Join()

... 
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(); 
... 

который ждет, пока результаты не processed.Unfortunately, это главное окно заморожен.

Как предложить многопоточное вычисление, позволяющее работать с основным окном во время вычисления, а также форму ждет до завершения вычисления?

Возможно ли добавить функцию, которая обрабатывает системные сообщения для цикла?

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