官术网_书友最值得收藏!

Time for action – running on the UI thread

To execute code on the UI thread, Runnable instances must be posted to the Display via one of two methods, syncExec or asyncExec. The syncExec method runs the code synchronously (the caller blocks until the code has been run) while the asyncExec method runs the code asynchronously (the caller continues while the code is run in the background).

The Display class is SWT's handle to a monitor (so a runtime may have more than one Display object, and each may have its own resolution). To get hold of an instance, call either Display.getCurrent() or Display.getDefault(). However, it's much better to get a Display from an associated view or widget. In this case, the Canvas has an associated Display.

  1. Go to the TickTock thread inside the createPartControl method of the ClockView class.
  2. Inside the redraw lambda, replace the call to clock.redraw() with this:
    // clock.redraw();
    clock.getDisplay().asyncExec(() -> clock.redraw());
  3. Run the target Eclipse instance and show the Clock View. The second hand should now update automatically.

What just happened?

This time, the event will execute as expected. One thread (TickTock) is running in the background, and every second it posts a Runnable to the UI thread, which then runs asynchronously. This example could have used syncExec and the difference would not have been noticeable—but in general, using asyncExec should be preferred unless there is a specific reason to need the synchronous blocking behavior.

The thread is in a while loop and is guarded with a call to clock.isDisposed(). Each SWT widget can be disposed with a call to dispose. Once a widget is disposed, any native operating system resources are returned and any further operations will throw an exception. In this example, the Canvas is disposed when the view is closed, which in turn disposes any components contained. As a result, when the view is closed, the Thread automatically ceases its loop (the thread can also be aborted by interrupting it during its 1-second sleep pauses).

主站蜘蛛池模板: 新化县| 紫金县| 绩溪县| 眉山市| 江北区| 册亨县| 龙游县| 芷江| 平远县| 葫芦岛市| 怀来县| 永胜县| 枞阳县| 曲靖市| 兰溪市| 木里| 石门县| 卓尼县| 常山县| 靖江市| 炎陵县| 手游| 河北区| 准格尔旗| 泗水县| 衡水市| 藁城市| 科技| 双辽市| 玉环县| 明溪县| 调兵山市| 华安县| 鄂托克旗| 灵台县| 唐海县| 海晏县| 凤阳县| 香河县| 黄大仙区| 开封市|