Задержка рабочего процесса Swing

У меня есть событие нажатия кнопки, которое запускает рабочий поток Swing, который, в свою очередь, запускает другой поток для выполнения длинных вычислений, включая запись файла. Затем этот файл считывается для рисования графики. Однако часть рисования никогда не происходит, если я не добавляю задержку между ними.. (Он говорит, что файл не найден, хотя файл есть.. Каков лучший способ исправить это, не добавляя задержки..

 private void buttonFragmentActionPerformed(java.awt.event.ActionEvent evt) {                                               
    try
    {
        ESIPlusFragmenterWorker epfw = new ESIPlusFragmenterWorker(10, sdfFile, cidSpectrum);
        epfw.execute();

        Thread.sleep(1000);

        holder.molTable1.drawMolViewPanel(currDir+sep+"esiFragments"+sep+"esiFrag.sdf");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

Свинг работник

public class ESIPlusFragmenterWorker extends SwingWorker<Void, Void>{

int mzppm_;
String SDF_;
String spectrum_;
Double mion_;
MolTable holder_;

ESIPlusFragmenterWorker(int mzppm, String SDF, String spectrum)
{
    mzppm_ = mzppm;
    SDF_ = SDF;
    spectrum_ = spectrum;
}

@Override
protected Void doInBackground() {
    try
    {
    Molecule mol;
    MolImporter importer = new MolImporter(SDF_);
    ExecutorService te = Executors.newFixedThreadPool(1);
    while ((mol  = importer.read()) != null) 
    {
     Runnable epf = new ESIPlusFragmenter(mol, spectrum_, mzppm_);
     Thread t = new Thread(epf);
     te.execute(epf);
    }
    importer.close();
    te.awaitTermination(10, TimeUnit.MINUTES);
    }
    catch (Exception e)
    {
      //  
    }
    finally
    {
        return null;
    }
}


@Override
protected void done() {
    try {
        //
    } catch (Exception e) {
        //e.printStackTrace();
    }
}

}


person lochi    schedule 10.06.2012    source источник


Ответы (1)


Никогда, никогда, никогда не вызывайте Thread.sleep(...) в EDT, так как это усыпит весь ваш графический интерфейс. И кроме того, что, если вы неправильно оцениваете, и фоновый процесс занимает больше времени, чем ваше время задержки сна?

Одним из возможных решений является добавление PropertyChangeListener в SwingWorker и прослушивание свойства «state», чтобы SwingWorker.StateValue было SwingWorker.StateValue.DONE, а затем выполните рисование.

e.g.

private void buttonFragmentActionPerformed(java.awt.event.ActionEvent evt) {
  try {
     ESIPlusFragmenterWorker epfw = new ESIPlusFragmenterWorker(10,
           sdfFile, cidSpectrum);
     epfw.addPropertyChangeListener(new PropertyChangeListener() {

        @Override
        public void propertyChange(PropertyChangeEvent pcEvt) {
           if ("state".equals(pcEvt.getPropertyName())) {
              if (pcEvt.getNewValue().equals(SwingWorker.StateValue.DONE)) {
                 holder.molTable1.drawMolViewPanel(currDir + sep
                       + "esiFragments" + sep + "esiFrag.sdf");
              }
           }
        }
     });
     epfw.execute();

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

Другим вариантом является вызов вашего держателя.molTable1.drawMolViewPanel внутри метода done() SwingWorker, и это тоже будет работать, но, делая это, как указано выше, с помощью PropertyChangeListener, SwingWorker не должен иметь никаких знаний о коде, вызываемом в прослушиватель (в отличие от использования метода SwingWorker done()), и это может обеспечить более слабую связь.

person Hovercraft Full Of Eels    schedule 10.06.2012
comment
+1 Это гораздо лучший ответ, чем однострочник, который я имел в виду. - person Robin; 10.06.2012
comment
Спасибо за подробный ответ. Однако этот подход не сработал. Интересно, проблема в другом? Я добавляю рабочий класс к вопросу. - person lochi; 10.06.2012
comment
Хорошо.. Я идиот.. Я забыл закрыть исполнитель потока..te.shutdown(); до te.awaitTermination(10, TimeUnit.MINUTES); Это устранило проблему. Спасибо за отличный подробный ответ. - person lochi; 10.06.2012
comment
@lochi: добро пожаловать и рад, что у вас все работает! - person Hovercraft Full Of Eels; 10.06.2012