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()执行一个在其中呈现图像的帧。我的意图是在新线程中呈现图像以等待图像上的一些用户交互。但是代码将框架引导到一个白色窗口,图像不可见,框架不可用。

在第二个线程中,我想在短时间内询问用户操作是否已完成。

这不是一个很好的解决方案,但有可能吗?这里有什么问题?

谢谢你的堆栈溢出!

4

2 回答 2

1

我可以在这里看到一些问题:

1.如果这个

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

正在 UI 线程上发生,那么您将阻止它接收用户输入(或执行任何其他操作),直到对象发出信号。

2.这部分似乎过于复杂:

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

除非你发出的信号比你上面所说的要多。但同样,这是多余的,因为启动一个线程只是为了等待它完成没有多大意义......

于 2012-08-14T12:46:49.337 回答
0

问题解决了。

该方法的调用者是一个 AWT 线程。我为调用者创建了一个新线程,因此 AWT-Thread 没有被阻塞,然后帧和图像可以正确显示。

感谢大家的帮助。

于 2012-08-15T11:18:36.073 回答