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

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).

主站蜘蛛池模板: 平顶山市| 巴青县| 介休市| 丰原市| 广水市| 屏边| 泰宁县| 奉节县| 锡林浩特市| 丘北县| 南投县| 大城县| 余干县| 洪湖市| 宜良县| 子长县| 军事| 清徐县| 杭州市| 磐安县| 汝阳县| 从化市| 夹江县| 德阳市| 湾仔区| 枣庄市| 石棉县| 惠州市| 菏泽市| 竹溪县| 巴林右旗| 灵宝市| 通辽市| 定结县| 钟祥市| 阿拉善右旗| 延川县| 宿州市| 清水河县| 大关县| 华池县|