2015-04-01 5 views
0

я попытался простой код для сканирования всех файлов из каталога с рекурсивным с SwingWorker но, кажется, выходные не было так хорошо здесь кодJava SwingWorker не работает должным образом, публиковать, но привычка процесс

public class BackupBackgroundProcess extends SwingWorker<Object, String> { 
    public BackupBackgroundProcess() { 
    } 
    @Override 
    protected void process(List<String> list) { 
     System.out.println("PROCESSING FILE = "+list.get(0)); 
    } 
    @Override 
    protected void done() { 
    } 
    @Override 
    protected FileStatus doInBackground() throws Exception { 
     System.out.println("OK"); 
     File[] root; 
     root = new File("/home/hilman/Pictures/err").listFiles(); 
     for (File file : root) { 
      seekFiles(file, this); 
     } 
     return null; 
    } 

    private void seekFiles(File f, SwingWorker thread) { 
     if(f.isDirectory()){ 
      File[] listedFiles = f.listFiles(); 
      for (int i = 0; i < listedFiles.length; i++) { 
       File file = listedFiles[i]; 
       seekFiles(file, thread); 
      } 
     } else { 
      System.out.println(" PUBLISHING FILE "+f.getAbsolutePath()); 
      publish(f.getAbsolutePath()); 

     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new BackupBackgroundProcess().execute(); 
      } 
     }); 

    } 
} 

Выход ожидание

OK 
PUBLISHING FILE /home/hilman/Pictures/err/_1427612060421_1.userfile 
PUBLISHING FILE /home/hilman/Pictures/err/pic2.png 
PUBLISHING FILE /home/hilman/Pictures/err/pic1.png 
PUBLISHING FILE /home/hilman/Pictures/err/1.png 
PROCESSING FILE = /home/hilman/Pictures/err/_1427612060421_1.userfile 
PROCESSING FILE = /home/hilman/Pictures/err/pic2.png 
PROCESSING FILE = /home/hilman/Pictures/err/pic1.png 
PROCESSING FILE = /home/hilman/Pictures/err/1.ong 

но мне кажется, что только появляются

OK 
PUBLISHING FILE /home/hilman/Pictures/err/_1427612060421_1.userfile 
PUBLISHING FILE /home/hilman/Pictures/err/pic2.png 
PUBLISHING FILE /home/hilman/Pictures/err/pic1.png 
PUBLISHING FILE /home/hilman/Pictures/err/1.png 
PROCESSING FILE = /home/hilman/Pictures/err/_1427612060421_1.userfile 

является swingworker doInBackground end независимо от того, что процесс не выполняется? Почему он не работает должным образом?

+0

Да, это, вероятно, потому, что у него не хватает времени, чтобы между вызовами «публиковать» обрабатывать очередь «publish». Попытка добавить что-то вроде 'Thread.yield' или' Thread.sleep' после каждого вызова 'seek' – MadProgrammer

+0

duh, можете ли вы сказать мне, какой метод я должен поставить Thread.sleep или Thread.yield? – user965347

+0

* «... после каждого вызова искать» * как идея;) – MadProgrammer

ответ

2

В основном, по моим наблюдениям, когда это происходит, это связано с тем, что то, что происходит в методе doBackground, предотвращает то, что когда-либо обрабатывало «очередь публикации» из возможности выполнить.

Попробуй добавить вызов Thread.yield или Thread.sleep где-то в цикле обработки, чтобы позволить «издательства» время потока для обработки «очереди публикации»

import java.io.File; 
import java.util.List; 
import javax.swing.SwingUtilities; 
import javax.swing.SwingWorker; 

public class BackupBackgroundProcess extends SwingWorker<Object, String> { 

    public BackupBackgroundProcess() { 
    } 

    @Override 
    protected void process(List<String> list) { 
     System.out.println("PROCESSING " + list.size() + " files"); 
    } 

    @Override 
    protected void done() { 
    } 

    @Override 
    protected Object doInBackground() throws Exception { 
     System.out.println("OK"); 
     File[] root; 
     root = new File("/home/hilman/Pictures/err").listFiles(); 
     for (File file : root) { 
      seekFiles(file, this); 
     } 
     return null; 
    } 

    private void seekFiles(File f, SwingWorker thread) { 
     if (f.isDirectory()) { 
      File[] listedFiles = f.listFiles(); 
      for (int i = 0; i < listedFiles.length; i++) { 
       File file = listedFiles[i]; 
       seekFiles(file, thread); 
      } 
     } else { 
      //   System.out.println(" PUBLISHING FILE " + f.getAbsolutePath()); 
      publish(f.getAbsolutePath()); 
      Thread.yield(); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new BackupBackgroundProcess().execute(); 
      } 
     }); 

    } 
} 

Поскольку вы делаете рекурсивный вызов, я поместил звонок по телефону Thread.yield после звонка publish, но вы можете так же легко разместить его в конце метода seek.

Помните, что процесс/публиковать процесс буферов результатов, поэтому, когда publish называется, вы можете получить несколько файлов, например ...

OK 
PROCESSING 122 files 
PROCESSING 127 files 
PROCESSING 184 files 
PROCESSING 144 files 
PROCESSING 131 files 
PROCESSING 147 files 
PROCESSING 335 files 
... 

Я предпочитаю использовать Thread.sleep(1), но я бы рекомендуя тестировать, и посмотрев, какие результаты вы получите ...

+0

да его работа. спасибо – user965347

+0

Рад, что это могло бы помочь – MadProgrammer

+0

@ user965347: Аналогичная проблема рассматривается [здесь] (http://stackoverflow.com/q/26844713/230513). – trashgod

Смежные вопросы