6

ファイル操作を行う一連の API があります。saveToFile(CustomObject objectToSave);

ファイル操作には時間がかかる可能性があるため、プログレス バーなどの何らかの表示をユーザーに表示することにしました。

aについて読んだProgressMonitorDialogので試してみましたが、必要なとおりに機能しません(または、適切に使用する方法がわかりません)。

現在私は:

ProgressMonitorDialog progressDialog = new ProgressMonitorDialog(theShell);  
    try {  
        progressDialog.run(false, true, new IRunnableWithProgress() {  

        @Override  
        public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {  
            monitor.beginTask("Saving your data", 100);  
            try {  
                Utils.saveToFile(objectToSave);  
            } catch (Exception e) {  
            // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
            monitor.done();   
        }  
     });   

このコードは進行状況ダイアログを非常に速く表示して終了しますが、問題は、遅い PC ではこれがUtils.saveToFile返されるまでスタックし、保存が完了するまで中間プロセスを示す方法がわかりません。

について言及しているスレッドを見つけましたIProgressMonitor.UNKNOWNmonitorperformRead(_fileName, monitor);

どうすればこれを解決できますか?

4

1 に答える 1

11

ProgressMonitorDialogトリッキーなコードです。IProgressMonitor#worked(int)欠けている部分は、プログレスバーを「成長」させる部分だと思います。以下は、使用方法を明確にするコード例です。

public class Progress {
    public static void main(String[] args)
    {
        // Create your new ProgressMonitorDialog with a IRunnableWithProgress
        try {
            // 10 is the workload, so in your case the number of files to copy
            IRunnableWithProgress op = new YourThread(10);
            new ProgressMonitorDialog(new Shell()).run(true, true, op);
         } catch (InvocationTargetException ex) {
             ex.printStackTrace();
         } catch (InterruptedException ex) {
             ex.printStackTrace();
         }
    }

    private static class YourThread implements IRunnableWithProgress
    {
        private int workload;

        public YourThread(int workload)
        {
            this.workload = workload;
        }

        @Override
        public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException
        {
            // Tell the user what you are doing
            monitor.beginTask("Copying files", workload);

            // Do your work
            for(int i = 0; i < workload; i++)
            {
                // Optionally add subtasks
                monitor.subTask("Copying file " + (i+1) + " of "+ workload + "...");

                Thread.sleep(2000);

                // Tell the monitor that you successfully finished one item of "workload"-many
                monitor.worked(1);

                // Check if the user pressed "cancel"
                if(monitor.isCanceled())
                {
                    monitor.done();
                    return;
                }
            }

            // You are done
            monitor.done();
        }

    }
}

次のようになります。

ここに画像の説明を入力

使用する特別なケースでは、このメソッドに引き渡して、そこからメソッドを呼び出すUtils.saveToFileことができます。IProgressMonitorworked()

于 2012-10-20T10:30:02.283 に答える