Java/SWT JFace Eclipse/Thread
Illustrates multithread UI programming issues
<source lang="java">
/******************************************************************************
* Copyright (c) 1998, 2004 Jackwind Li Guojie * All right reserved. * * Created on Oct 25, 2003 4:12:32 PM by JACK * $Id: PICalculator.java,v 1.1 2003/12/22 12:07:54 jackwind Exp $ * * visit: http://www.asprise.ru/swt *****************************************************************************/
import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; /**
* Illustrates multithread UI programming issues. */
public class PICalculator {
Display display = new Display(); Shell shell = new Shell(display); Button buttonThread = new Button(shell, SWT.PUSH); Button buttonAsyncExec = new Button(shell, SWT.PUSH); public PICalculator(boolean asyncExecEnabled) { final boolean async = asyncExecEnabled; shell.setText("PI Calculator"); shell.setSize(400, 80); Rectangle clientArea = shell.getClientArea(); buttonThread.setText( "Click here to calculate PI [Non-UI thread UI Update]"); buttonThread.setBounds( clientArea.x, clientArea.y, clientArea.width, clientArea.height / 2); buttonThread.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { buttonThread.setText("Calculation in progress ..."); getTask(buttonThread).start(); } }); buttonAsyncExec.setText("Click here to calculate PI [asynExec method UI Update]"); buttonAsyncExec.setBounds( clientArea.x, clientArea.y + clientArea.height / 2, clientArea.width, clientArea.height / 2); buttonAsyncExec.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { buttonAsyncExec.setText("Calculation in progress ..."); getTask2(buttonAsyncExec).start(); } }); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } public static void main(String[] args) { // new CalculatePI(false); new PICalculator(true); } public Thread getTask(Button button) { final Button theButton = button; return new Thread() { public void run() { double pi = calculatePI(9999999); theButton.setText("PI = " + pi); // Update UI. } }; } public Thread getTask2(Button button) { final Button theButton = button; return new Thread() { public void run() { final double pi = calculatePI(9999999); display.asyncExec(new Runnable() { public void run() { // Update UI. theButton.setText("PI = " + pi); } }); } }; } /** * Calculate value of PI using Vieta"s formula. For a complete discussion, * please visit: * http://documents.wolfram.ru/v4/GettingStarted/CalculatingPi.html * * @param nestedLevel - * level of nested square roots in Vieta"s formula. * @return value of PI */ public static double calculatePI(int nestedLevel) { double product = 1; double lastSqrtValue = 0; for (int i = 0; i < nestedLevel; i++) { double sqrt = getNextSqrtValue(lastSqrtValue); product *= 0.5 * sqrt; lastSqrtValue = sqrt; } return 2 / product; } /** * Return the square root item value. * * @param lastValue - * last square root item value. * @return */ public static double getNextSqrtValue(double lastValue) { return Math.sqrt(2 + lastValue); }
}
</source>
SWT and Thread
<source lang="java">
/******************************************************************************
* Copyright (c) 1998, 2004 Jackwind Li Guojie * All right reserved. * * Created on Oct 26, 2003 2:45:03 PM by JACK * $Id: SyncExecExample.java,v 1.1 2003/12/22 12:07:54 jackwind Exp $ * * visit: http://www.asprise.ru/swt *****************************************************************************/
import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; /**
* syncExec Example. */
public class SyncExecExample {
public static void main(String[] args) { final Display display = new Display(); Shell shell = new Shell(display); final Runnable print = new Runnable() { public void run() { System.out.println("Print from thread: \t" + Thread.currentThread().getName()); } }; final Thread applicationThread = new Thread("applicationThread") { public void run() { System.out.println("Hello from thread: \t" + Thread.currentThread().getName()); display.syncExec(print); System.out.println("Bye from thread: \t" + Thread.currentThread().getName()); } }; shell.setText("syncExec Example"); shell.setSize(300, 100); Button button = new Button(shell, SWT.CENTER); button.setText("Click to start"); button.setBounds(shell.getClientArea()); button.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { applicationThread.start(); } }); shell.open(); while(! shell.isDisposed()) { if(! display.readAndDispatch()) {// If no more entries in event queue display.sleep(); } } display.dispose(); }
}
</source>