2012-08-14 3 views
0
public class Signal2NoiseRatio 
{ 
    public ImagePlus SingleSNR(ImagePlus imagePlus) throws InterruptedException 
    { 

     new Thread() 
     { 
      @Override public void run() 
      { 
       JFrame imageFrame = new JFrame("ROI"); 
       Container imageFrame_Container = imageFrame.getContentPane(); 
       IIImagePanel imagePanel = new IIImagePanel(); 
       imageFrame_Container.add(imagePanel); 
       imagePanel.setImage(imagePlus.getImage()); 
       imagePanel.getDisplayedImage(); 
       imageFrame.setVisible(true); 
       final SNRSingleImageListener sNRSingleListener = new SNRSingleImageListener(imagePanel); 
       imagePanel.addMouseListener(sNRSingleListener); 
       imagePanel.addMouseMotionListener(sNRSingleListener); 
      } 
     }.start(); 


     new Thread() 
    { 
     @Override public void run() 
     { 

      for (int i = 0; i <= 2000; i++) 
      { 
      System.out.println("schleife "+i); 
        // ask if useractions are done .. 
      } 

      synchronized(Signal2NoiseRatio.this) 
      { 

      Signal2NoiseRatio.this.notifyAll(); 

      } 
     } 
    }.start(); 


     synchronized (this) 
     { 
     this.wait(); 
      // if userinteractions are done, go on 
     } 


     return imagePlusToProcess; 
    } 
} 

첫 번째 new Thread()은 이미지를 표시하는 프레임을 수행합니다. 나의 의도는 새로운 스레드에 이미지를 제시하여 이미지의 일부 사용자 상호 작용을 기다리는 것이 었습니다. 그러나 코드는 프레임을 흰색 윈도우로 유도하고 이미지는 보이지 않으며 프레임을 사용할 수 없습니다.Java 병렬 스레딩

사용자 작업이 완료되면 짧은 간격으로 질문하고 싶습니다.

정말 좋은 해결책은 아니지만 가능합니까? 여기서 뭐가 잘못 됐니?

Thank you stackoverflow!

+0

'IIImagePanel' 클래스는 스레드없이 작동합니까? – martijno

+1

이벤트 디스패치 스레드가 아닌 다른 스레드에서 Swing 구성 요소를 만들거나 액세스 할 수 없다는 것이 한 가지 문제입니다. 둘째,'notifyAll()'호출은 결코'synchronized' 블록 안에 있기 때문에 결코 실행되지 않습니다. 나는 당신이 찾고있는 것을 믿고, 그 중 어떤 것도 동기화 된 블록이 필요하지 않습니다. –

+0

IIImagePanel은 스레드없이 작동합니다. – hagem

답변

0

문제가 해결되었습니다.

메소드의 호출자는 AWT-Thread입니다. 호출자를 위해 새 스레드를 만들었으므로 AWT- 스레드가 차단되지 않았으므로 프레임과 이미지가 올바르게 표시 될 수있었습니다.

도움 주셔서 감사합니다.

+1

이 답변에 동의 표시를하십시오. – Tudor

1

내가 몇 여기에 문제를 볼 수 있습니다 다음은 사용자 입력을 수신 (또는 다른 아무것도)까지에서 그것을 차단, UI 스레드에서 일어나고있는이

synchronized (this) 
{ 
    this.wait(); 
    // if userinteractions are done, go on 
} 

설치 1.

객체가 신호됩니다.

2.이 부분은 거의 overcomplicated 것 같다 :

new Thread() { 
     @Override 
     public void run() { 

      for (int i = 0; i <= 2000; i++) { 
       System.out.println("schleife " + i); 
       // ask if useractions are done .. 
      } 

      synchronized (Signal2NoiseRatio.this) { 

       Signal2NoiseRatio.this.notifyAll(); 

      } 
     } 
    }.start(); 

    synchronized (this) { 
     this.wait(); 
     // if userinteractions are done, go on 
    } 

그냥 사용

Thread t = new Thread() { 
     @Override 
     public void run() { 

      for (int i = 0; i <= 2000; i++) { 
       System.out.println("schleife " + i); 
       // ask if useractions are done .. 
      } 

     } 
    }.start(); 

    t.join(); 

것은 당신이 위 한 것보다 더 많은 신호하지 않는 한. 그러나 스레드가 끝나기를 기다리기 만하면 스레드를 시작하는 것이 많은 의미를 갖지 않으므로 다시 말하지만, 이것은 중복됩니다.

+0

새 Frame을 SingleSNR 메서드에서 사용하기 위해 구현하는 쉬운 방법은 무엇입니까 ?? 나는 달릴 수 없다. 내 목표는 메서드가 반환되기 전에 사용자 상호 작용을 기다리는 것입니다. – hagem

+0

@haxenmaxen : 그렇다면 모달 프레임과 같은 것을 원하십니까? 그래서 그것은 나타납니다하지만 당신은 아이가 닫힐 때까지 부모 프레임에 접근 할 수 없습니까? – Tudor

+0

흠, 나는 그것이 부분적이라고 생각한다. SingleSNR 메서드는 처리 할 이미지를 가져오고 새 처리 된 이미지를 반환해야합니다. 따라서 사용자는 이미지에서 직사각형을 선택해야합니다. 선택한 영역이 계산되고 처리됩니다.사각형 선택을 위해 이미지가있는 새 프레임이 필요합니다. 이 메소드는 사용자가 선택한 직사각형을 기다렸다가 이후에 계산해야합니다. 결국 그것은 새로운 이미지를 반환해야합니다. – hagem