Jump to: navigation, search

Difference between revisions of "FAQ How do I prevent builds between multiple changes to the workspace?"

 
m
Line 8: Line 8:
 
<tt>IMarker</tt> objects will cause separate resource change events if
 
<tt>IMarker</tt> objects will cause separate resource change events if
 
they are not batched.
 
they are not batched.
 
  
 
Two different mechanisms are available for batching changes.  To
 
Two different mechanisms are available for batching changes.  To
 
run a series of changes in the current thread, use <tt>IWorkspaceRunnable</tt>.
 
run a series of changes in the current thread, use <tt>IWorkspaceRunnable</tt>.
 
Here is an example of a workspace runnable that creates two folders:
 
Here is an example of a workspace runnable that creates two folders:
 +
 
<pre>
 
<pre>
 
   final IFolder folder1 = ..., folder2 = ...;
 
   final IFolder folder1 = ..., folder2 = ...;
Line 22: Line 22:
 
   }, null);
 
   }, null);
 
</pre>
 
</pre>
 
  
 
The other mechanism for batching resource changes is a <tt>WorkspaceJob</tt>.
 
The other mechanism for batching resource changes is a <tt>WorkspaceJob</tt>.
Line 29: Line 28:
 
thread and then cause a single resource change notification and autobuild to occur. Here
 
thread and then cause a single resource change notification and autobuild to occur. Here
 
is sample code using a workspace job:
 
is sample code using a workspace job:
 +
 
<pre>
 
<pre>
 
   final IFolder folder1 = ..., folder2 = ...;
 
   final IFolder folder1 = ..., folder2 = ...;
Line 41: Line 41:
 
   job.schedule();
 
   job.schedule();
 
</pre>
 
</pre>
 
  
 
== See Also: ==
 
== See Also: ==
 
+
*[[FAQ_Does_the_platform_have_support_for_concurrency%3F]]
[[FAQ_Does_the_platform_have_support_for_concurrency%3F]]
+
*[[FAQ What are IWorkspaceRunnable, IRunnableWithProgress, and WorkspaceModifyOperation?]]
 
+
[[FAQ_What_are_%3Ctt%3EIWorkspaceRunnable%3C%2Ftt%3E%2C_%3Ctt%3EIRunnableWithProgress%3C%2Ftt%3E%2C_and_%3Ctt%3EWorkspaceModifyOperation%3C%2Ftt%3E%3F]]
+
  
 
<hr><font size=-2>This FAQ was originally published in [http://www.eclipsefaq.org Official Eclipse 3.0 FAQs]. Copyright 2004, Pearson Education, Inc. All rights reserved. This text is made available here under the terms of the [http://www.eclipse.org/legal/epl-v10.html Eclipse Public License v1.0].</font>
 
<hr><font size=-2>This FAQ was originally published in [http://www.eclipsefaq.org Official Eclipse 3.0 FAQs]. Copyright 2004, Pearson Education, Inc. All rights reserved. This text is made available here under the terms of the [http://www.eclipse.org/legal/epl-v10.html Eclipse Public License v1.0].</font>

Revision as of 21:13, 29 May 2006

Every time resources in the workspace change, a resource change notification is broadcast, and autobuild gets a chance to run. This can become very costly if you are making several changes in succession to the workspace. To avoid these extra builds and notifications, it is very important that you batch all of your workspace changes into a single workspace operation. It is easy to accidentally cause extra builds if you aren’t very careful about batching your changes. For example, even creating and modifying attributes on IMarker objects will cause separate resource change events if they are not batched.

Two different mechanisms are available for batching changes. To run a series of changes in the current thread, use IWorkspaceRunnable. Here is an example of a workspace runnable that creates two folders:

   final IFolder folder1 = ..., folder2 = ...;
   workspace.run(new IWorkspaceRunnable() {
      public void run(IProgressMonitor monitor) {
         folder1.create(IResource.NONE, true, null);
         folder2.create(IResource.NONE, true, null);
      }
   }, null);

The other mechanism for batching resource changes is a WorkspaceJob. Introduced in Eclipse 3.0, this mechanism is the asynchronous equivalent of IWorkspaceRunnable. When you create and schedule a workspace job, it will perform the changes in a background thread and then cause a single resource change notification and autobuild to occur. Here is sample code using a workspace job:

   final IFolder folder1 = ..., folder2 = ...;
   Job job = new WorkspaceJob("Creating folders") {
      public IStatus runInWorkspace(IProgressMonitor monitor) 
         throws CoreException {
         folder1.create(IResource.NONE, true, null);
         folder2.create(IResource.NONE, true, null);
         return Status.OK_STATUS;
      }
   };
   job.schedule();

See Also:


This FAQ was originally published in Official Eclipse 3.0 FAQs. Copyright 2004, Pearson Education, Inc. All rights reserved. This text is made available here under the terms of the Eclipse Public License v1.0.