srk
srk

Reputation: 5146

Best practices Implementing ProgressMonitorDialog in Eclipse RCP

I wish to Show progress of a long running operation(process) in UI, so that the user can understand the status of the background job. This is the way I have implemented and I feel like the code is absurd. Below is my code

dialog.run(true,false, new IRunnableWithProgress() {
    @Override
    public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
        monitor.beginTask("Main process", 10);
        for (int i = 0; i < 10; i++) {
            if (monitor.isCanceled()) return;
            monitor.subTask("Status  message");
            sleep(1000);
            // worked increases the monitor, the values are added to the existing ones
            monitor.worked(1);
            if(i == 3) {
                sleep(3000);
                callMe();//calling a long running function 
            }
            if(i == 9) {
                monitor.subTask("finishing setup..... please wait ");
                sleep(2000);
            }
        }
        monitor.done();
    }
});

Note: There is a sleep method somewhere in the code

here at i == 3 an operation/function is called that takes a minimum of 5 minutes, post execution of the function the progress continues.

I don't want the progress to be stopped while executing the function(long running operation) rather progress must be shown even while executing it.

can someone show the correct programming practices in showing progress

Upvotes: 1

Views: 1494

Answers (1)

Eirik W
Eirik W

Reputation: 3145

The reason your code feels absurd is that wrapping the long-running method in a IRunnableWithProgress.run() really does not add much in itself, there is no magic.

To make the ProgressMonitorDialog (or e.g. the related Job API) work for you, you need to change "callMe()" so it takes "IProgressMonitor monitor" as a parameter, and use that to listen for cancel-requests, and use it also for reporting progress.

To say the same again, using different wording: You need to recursively add "IProgressMonitor monitor" as a parameter to all long-running method calls. All long-running operations must be build with this (IProgressMonitor) in mind if any progress is to be reported and/or you want it to be cancelable.

Upvotes: 1

Related Questions