2012-09-10 1 views
1

Button1을 누르면 다음 코드 줄에서 encode() 메서드 실행이 완료 될 때까지 Jframe이 응답하지 않게됩니다. 하지만 진행 상황을 표시하는 Jframe 진행률 표시 줄을 업데이트해야합니다. JButtonActionPerformed에서 시간이 많이 소요되는 메서드 호출

private void Button1ActionPerformed(java.awt.event.ActionEvent evt) {         
    try { 
     if (flagState == 0) { 
      WavFile.decode(readWavFile, msg.getText(), key.getText().hashCode()); 
     } else if (flagState == 1) { 
      WavFile.encode(readWavFile, msg.getText(), key.getText().hashCode());    
     } 
    } catch (WavFileException | IOException e) { 
     notes.setText(e.getMessage()); 
    } 
}   

나는이

private void Button1ActionPerformed(java.awt.event.ActionEvent evt) {         
    try { 
     if (flagState == 0) { 
      Thread t = new Thread(new Runnable() { 
           public void run() { 
            WavFile.decode(readWavFile, msg.getText(), key.getText().hashCode()); 
           } 
          };) 
      t.start(); 
     } else if (flagState == 1) { 
      Thread t = new Thread(new Runnable() { 
           public void run() { 
            WavFile.encode(readWavFile, msg.getText(), key.getText().hashCode()); 
           } 
          };) 
      t.start(); 
     } 
    } catch (WavFileException | IOException e) { 
     notes.setText(e.getMessage()); 
    } 
} 

일을 생각하고, 인코딩() 메소드에서 진행 표시 줄을 업데이트합니다.

하지만 모듈간에 강력한 결합이 있다는 것을 이해합니다.

나는 매번 새로운 스레드를 호출하는 것이 좋은 생각이라고 생각한다. (ExecutorService는 생각할 수 있지만 사용법은 확실하지 않다.)

괜찮은 조각 코드로 만들려면 어떻게해야합니까 ??

답변

1

스레딩은 여기에서 소개해야합니다. 완료하는 데 상당한 시간이 걸리면 awt 이벤트 스레드에서 실행하면 안됩니다.

버튼을 클릭 할 때마다 새 스레드를 생성하는 것이 본질적으로 문제가되지 않습니다. 그러나 첫 번째 완료 전에도 동일한 작업을 수행하는 많은 스레드를 생성하는 것이 가능할 수도 있음을 고려해야합니다. 원하는 경우 Executor를 사용할 수는 있지만 필수는 아닙니다.

진행 상황을 추적 할 때 주기적으로 다른 스레드를 쿼리하고 필요에 따라 진행률 표시 줄을 업데이트하는 다른 스레드를 추가합니다. 다음과 같이 구조화하는 방법은 다음과 같습니다.

private void Button1ActionPerformed(java.awt.event.ActionEvent evt) { 
    disableButton1(); 
    final Thread t; 
    if (flagState == 0) { 
     t = new Thread(new Runnable() { 
      public void run() { 
       try { 
        WavFile.decode(readWavFile, msg.getText(), key.getText().hashCode()); 
       } catch (WavFileException | IOException e) { 
        notes.setText(e.getMessage()); 
       } 
      } 
     }); 
    } else if (flagState == 1) { 
     t = new Thread(new Runnable() { 
      public void run() { 
       try { 
        WavFile.encode(readWavFile, msg.getText(), key.getText().hashCode()); 
       } catch (WavFileException | IOException e) { 
        notes.setText(e.getMessage()); 
       } 
      } 
     }); 
    } 

    Thread monitor = new Thread(new Runnable() { 
     public void run() { 
      try { 
       while (notComplete(t)) { 
        setProgressBar(getProgress(t)); 
        Thread.sleep(SLEEP_TIME); 
       } 
       t.join(); 
      } finally { 
       enableButton1(); 
      } 
     } 
    }); 

    t.start(); 
    monitor.start(); 
} 
+0

모니터 스레드는 생각하지 않았습니다. 나는이 접근법을 좋아한다. 고마워. – Soumy

+2

'진행률 표시 줄 '이'JProgressBar '를 의미하는 경우 해당 호출은 EDT에 대해 예약되어야합니다. –

0

멀티 스레딩이 필요합니다. 새로운 스레드를 호출하는 것에 대해 걱정할 필요가없는 다른 좋은 방법은 없습니다. 그 스레드는 사용할 수있는 스레드 풀을 가지고 있습니다. 이러한 종류의 것들 스레드와 함께 정말 잘 실행, 그것을 밖으로 시도하십시오!

Runnable을 확장하는 클래스를 만들고, run 메서드를 구현하거나 현재 메서드를 호출하도록 만듭니다.이 메서드는이를 수행하기에 충분해야합니다.

또한 잠시 동안 잠자기 상태가 될 때마다 상태를 확인하고, 프로세스가 끝나면 계속 진행할 수 있습니다. 그렇지 않은 경우 다시 짧은 시간 동안 다시 잠자기 상태로 돌아갈 수 있습니다. 여러 번 물어야합니다.

도움이되기를 바랍니다.

1

n Button1을 누르면 다음 코드 줄이 표시되어 encode() 메서드 실행이 완료 될 때까지 Jframe이 응답하지 않게됩니다. 하지만 진행 상황을 표시하는 Jframe 진행률 표시 줄을 업데이트해야합니다. 코드가

당신은, 당신 block the EDT, 응답하지 않는 GUI가 발생, Concurency in Swing에 문제가

  • 사용 setEnabled() 대신 if (flagState == 0) {