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

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

主站蜘蛛池模板: 仁寿县| 肃宁县| 喀什市| 屯留县| 师宗县| 万载县| 巍山| 洪湖市| 汽车| 汉中市| 东阿县| 牡丹江市| 平罗县| 佛学| 沅江市| 南投县| 孟津县| 齐齐哈尔市| 黄梅县| 华坪县| 刚察县| 连州市| 牟定县| 嵩明县| 兴海县| 临夏县| 准格尔旗| 金寨县| 大渡口区| 仁怀市| 凌云县| 金山区| 赤城县| 喜德县| 乳源| 疏勒县| 阿图什市| 车险| 景洪市| 德保县| 长丰县|