0

アプリケーションに進行状況モニター ダイアログを実装したいと考えています。この機能は、大きなファイル/フォルダーをある場所から Windows 内の別の場所にコピーすることです。ウィンドウ内でコピー アンド ペーストを行う場合、約 7 ~ 10 分かかる場合があります。eclipse rcp プログレス モニター ダイアログを介して実装する場合、タスクを完了するための合計時間をどのように計算するのでしょうか?ファイルが小さい場合は時間が非常に短く、ファイルが大きい場合は膨大な時間がかかるためです。TOTAL_TIME = 10000.では、彼女に対するハードコーディングの利点は何ですか? ジョブが完了すると、約 7 ~ 8 分かかったと言えます。これは、次のコードを実行したときに発生した混乱です。

ファイルサイズアルゴリズムに基づいてコピーします。

サンプルの例があり、合計時間が次のように言及されていますTOTAL_TIME = 10000.

以下はサンプルコードです:

public void run(IProgressMonitor monitor) throws InvocationTargetException,
      InterruptedException {
    monitor.beginTask("Running long running operation",
        indeterminate ? IProgressMonitor.UNKNOWN : TOTAL_TIME);
    for (int total = 0; total < TOTAL_TIME && !monitor.isCanceled(); total += INCREMENT) {
      Thread.sleep(INCREMENT);
      monitor.worked(INCREMENT);
      if (total == TOTAL_TIME / 2) monitor.subTask("Doing second half");
    }
    monitor.done();
    if (monitor.isCanceled())
        throw new InterruptedException("The long running operation was cancelled");
  }
}
4

1 に答える 1

0

このようなものを使用できます (これは大まかな例であり、さまざまな方法で改善できます)。

        FileChannel src = null;
        FileChannel dest = null;
        try {
            src = new FileInputStream(file1).getChannel();
            dest = new FileOutputStream(file2).getChannel();

            int offset = 1024;
            long totalSize = src.size();
            long position = 0;

            int numberOfIterations = (int) (totalSize / offset);
            int currentIteration = 0;

            monitor.beginTask("Running long running operation", numberOfIterations);

            while (!monitor.isCanceled()) {
                long start = System.currentTimeMillis();
                dest.transferFrom(src, position, position + offset);
                long end = System.currentTimeMillis();
                monitor.worked(currentIteration++);
                long timeElapsedPerOneIteration = (end - start) / 1000;
                monitor.setTaskName("Running long running operation. Time left: "
                    + ((timeElapsedPerOneIteration * numberOfIterations) - timeElapsedPerOneIteration * currentIteration)
                    + " seconds.");
                position += offset;
                if (position >= totalSize) {
                    monitor.done();
                    break;
                }
            }
        } catch (FileNotFoundException e) {
            // hanlde
        } catch (IOException e) {
            // hanlde
        } finally {
            if (src != null) {
                try {
                    src.close();
                } catch (IOException e) {
                    // hanlde
                }
            }
            if (dest != null) {
                try {
                    dest.close();
                } catch (IOException e) {
                    // hanlde
                }
            }
        }
于 2013-10-09T07:52:31.300 に答える