- Eclipse Plug-in Development:Beginner's Guide(Second Edition)
- Dr Alex Blewitt
- 375字
- 2021-07-14 10:36:27
Time for action – animating the second hand
The second hand is drawn with a redraw
on the Canvas
, but this will need to be run periodically. If it is redrawn once per second, it can emulate a clock ticking.
Eclipse has a jobs
plug-in, which would be just right for this task, but this will be covered in Chapter 4, Interacting with the User. So to begin with, a simple Thread
will be used to issue the redraw.
- Open the
ClockView
class. - Add the following at the bottom of the
createPartControl
method:Runnable redraw = () -> { while (!clock.isDisposed()) { clock.redraw(); try { Thread.sleep(1000); } catch (InterruptedException e) { return; } } }; new Thread(redraw, "TickTock").start();
- Relaunch the test Eclipse instance, and open the Clock View.
- Open the host Eclipse instance and look in the Console View for the errors.
What just happened?
When the ClockView
is shown, a Thread
is created and started, which redraws the clock once per second. When it is shown, an exception is generated, which can be seen in the host Eclipse instance's Console View:
Exception in thread "TickTock" org.eclipse.swt.SWTException: Invalid thread access at org.eclipse.swt.SWT.error(SWT.java:4477) at org.eclipse.swt.SWT.error(SWT.java:4392) at org.eclipse.swt.SWT.error(SWT.java:4363) at org.eclipse.swt.widgets.Widget.error(Widget.java:783) at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:574) at org.eclipse.swt.widgets.Control.redraw(Control.java:2279) at com.packtpub.e4.clock.ui.views.ClockView$2.run(ClockView.java:29)
This is expected behavior in this case, but it's worth taking a dive into the SWT internals to understand why.
Many windowing systems have a UI thread, which is responsible for coordinating the user interface updates with the program code. If long-running operations execute on the UI thread, then the program can appear to hang and become unresponsive. Many windowing systems will have an automated process that changes the cursor into an hourglass or spinning beach ball if the UI thread for an application is blocked for more than a short period of time.
SWT mirrors this by providing a UI thread for interacting with the user interface, and ensures that updates to SWT components are performed on this thread. Redraws occur on the SWT thread, as do calls to methods such as createPartControl
.
In the clock update example, updates are being fired on a different thread (in this case, the TickTock
thread), and this results in the exception shown earlier. So how are these updates run on the correct thread?
- Java Web開發學習手冊
- Swift 3 New Features
- Python貝葉斯分析(第2版)
- Python機器學習算法與實戰
- Visual C++開發入行真功夫
- 計算機應用基礎教程(Windows 7+Office 2010)
- 遠方:兩位持續創業者的點滴思考
- Mastering Embedded Linux Programming
- Java高手是怎樣煉成的:原理、方法與實踐
- Spring Boot從入門到實戰
- Python數據預處理技術與實踐
- 產品架構評估原理與方法
- 現代JavaScript編程:經典范例與實踐技巧
- Flask Web開發實戰:入門、進階與原理解析
- Implementing DevOps with Ansible 2