14

I am writing a desktop application using SWT. What is the simplest way to update GUI controls from another thread?

Apache
  • 1,060
  • 5
  • 21
  • 38
Michał Ziober
  • 37,175
  • 18
  • 99
  • 146

4 Answers4

19

Use Display.asyncExec or Display.syncExec, depending on your needs.

For example, another thread might call this method to safely update a label:

  private static void doUpdate(final Display display, final Label target,
      final String value) {
    display.asyncExec(new Runnable() {
      @Override
      public void run() {
        if (!target.isDisposed()) {
          target.setText(value);
          target.getParent().layout();
        }
      }
    });
  }
McDowell
  • 107,573
  • 31
  • 204
  • 267
6

There's a tutorial here.

"SWT does make a point to fail-fast when it comes to threading problems; so at least the typical problems don't go unnoticed until production. The question is, however, what do you do if you need to update a label/button/super-duper-control in SWT from a background thread? Well, it's surprisingly similar to Swing:"

// Code in background thread.
doSomeExpensiveProcessing();
Display.getDefault().asyncExec(new Runnable() {
 public void run() {
  someSwtLabel.setText("Complete!");
 }
});
Adamski
  • 54,009
  • 15
  • 113
  • 152
0

You can actually just sent a message to the GUI thread that some modification has been changed. This is cleaner if you see it from MVC perspective.

nanda
  • 24,458
  • 13
  • 71
  • 90
-1

When creating the separate thread from the main thread pass the Gui object to the new thread and u can access all the properties of that GUI object.

  • Just because the GUI thread has a reference to the GUI object, doesn't mean that it has access to it. You can only update GUI objects from the original thread. – Rich S Aug 24 '12 at 15:08