Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create a background task in IntelliJ plugin

I'm developing an IntelliJ-idea plugin and want to run code in background task (visible in the background tasks dialog and in another thread than the UI).

I found the following Helper class and tried it by passing a Runnable object and implement its run method but it still blocking the UI and when I tried to do the threading myself i got the following error

 Read access is allowed from event dispatch thread or inside read-action only (see com.intellij.openapi.application.Application.runReadAction())
     Details: Current thread: Thread[Thread-69 [WriteAccessToken],6,Idea Thread Group] 532224832
     Our dispatch thread:Thread[AWT-EventQueue-1 12.1.4#IU-129.713, eap:false,6,Idea Thread Group] 324031064
     SystemEventQueueThread: Thread[AWT-EventQueue-1 12.1.4#IU-129.713, eap:false,6,Idea Thread Group] 324031064
like image 830
Mahmoud Adam Avatar asked Sep 10 '13 17:09

Mahmoud Adam


People also ask

Does PyCharm run in the background?

When lengthy tasks are running, for example, search and replace, VCS update, and so on, PyCharm displays the progress bar. You can bring execution of such tasks to the background by clicking the Background button. However, when a task of a certain type is brought to the background, you can still view its progress.


1 Answers

I have found a better way to run the process as background task where you can update the progress bar percentage and text

ProgressManager.getInstance().run(new Task.Backgroundable(project, "Title"){
        public void run(@NotNull ProgressIndicator progressIndicator) {

            // start your process

            // Set the progress bar percentage and text
            progressIndicator.setFraction(0.10);
            progressIndicator.setText("90% to finish");


            // 50% done
            progressIndicator.setFraction(0.50);
            progressIndicator.setText("50% to finish");


            // Finished
            progressIndicator.setFraction(1.0);
            progressIndicator.setText("finished");

        }});

If you need to read some data from another thread you should use

AccessToken token = null;
try {
   token = ApplicationManager.getApplication().acquireReadActionLock();
                    //do what you need
} finally {
   token.finish();
}
like image 127
Mahmoud Adam Avatar answered Sep 22 '22 14:09

Mahmoud Adam