Thread overview |
---|
October 31, 2008 DWT multi thread issue | ||||
---|---|---|---|---|
| ||||
I ported a SWT multi thread sample to D, but it not worked, and body help? tested with recent dwt-win on Windows XP, compile by DMD 1.036, click on the button, nothing happen: import dwt.DWT; import dwt.widgets.Listener; import dwt.widgets.Event; import dwt.custom.BusyIndicator; import dwt.events.SelectionAdapter; import dwt.events.SelectionEvent; import dwt.layout.GridData; import dwt.layout.GridLayout; import dwt.widgets.Button; import dwt.widgets.Display; import dwt.widgets.List; import dwt.widgets.Shell; import tango.core.Thread; import tango.time.WallClock; import tango.util.Convert; import tango.io.Stdout; import dwt.dwthelper.utils; /** * @author tenyears.cn */ public class SWTThread { private int size = 10; // private long runTime = 50000; // 50 seconds private List list; private Shell shell; void dgRefresh() { Thread thread = new Thread( {new RunOne();} ); thread.start(); } class RunOne : Runnable { uint i; void run() { long start = WallClock.now.span.millis; shell.setText( "wait " ~ to!(String)(i++) ); while ((WallClock.now.span.millis() - start) < runTime) { shell.setText( "wait " ~ to!(String)(i++) ); Thread.sleep(10); } } } public void startThread() { try { Runnable refresh = dgRunnable(&dgRefresh); BusyIndicator.showWhile(shell.getDisplay(), refresh);//这一句很关键 } catch(Exception e) {Stdout.formatln("startThread catch {}", e.msg);} } void onStartBtn(Event event) { try { startThread(); } catch(Exception e) {Stdout.formatln("onStartBtn catch {}", e.msg);} } public Shell open(Display display) { shell = new Shell(display, DWT.DIALOG_TRIM | DWT.MIN); shell.setText("SWT Thread Test"); shell.setLayout(new GridLayout(1, true)); list = new List(shell, DWT.BORDER); list.setLayoutData(new GridData(DWT.FILL, DWT.FILL, true, true)); for (int index = 0; index < size; index++) list.add("String " ~ to!(String) (index + 1)); Button startBtn = new Button(shell, DWT.PUSH); startBtn.setLayoutData(new GridData(DWT.FILL, DWT.CENTER, true, false)); startBtn.setText("Start"); startBtn.addListener(DWT.Selection, dgListener(&onStartBtn)); shell.setSize(400, 300); shell.open(); return shell; } } public void main(String[] args) { Display display = new Display(); SWTThread application = new SWTThread(); Shell shell = application.open(display); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } SWT code: http://blog.csdn.net/baobeiSimple/archive/2007/08/22/1753910.aspx -- yidabu <yidabu.spam@gmail.com> http://www.dsource.org/projects/dwin D 语言-中文(D Chinese): http://www.d-programming-language-china.org/ http://bbs.d-programming-language-china.org/ http://dwin.d-programming-language-china.org/ http://scite4d.d-programming-language-china.org/ |
October 31, 2008 Re: DWT multi thread issue | ||||
---|---|---|---|---|
| ||||
Posted in reply to yidabu | I cannot try it right now, but perhaps this works? : void dgRefresh() { auto runOne = new RunOne(); Thread thread = new Thread( &runOne.run ); thread.start(); } |
October 31, 2008 Re: DWT multi thread issue | ||||
---|---|---|---|---|
| ||||
Posted in reply to yidabu | shell.setText( "wait " ~ to!(String)(i++) );
only works on GUI thread, otherwise it will throw exception,
you should using display.synExec(...); make sure it be called
in GUI thread.
> I ported a SWT multi thread sample to D, but it not worked, and body help? tested with recent dwt-win on Windows XP, compile by DMD 1.036, click on the button, nothing happen:
>
>
> import dwt.DWT;
> import dwt.widgets.Listener;
> import dwt.widgets.Event;
> import dwt.custom.BusyIndicator;
> import dwt.events.SelectionAdapter;
> import dwt.events.SelectionEvent;
> import dwt.layout.GridData;
> import dwt.layout.GridLayout;
> import dwt.widgets.Button;
> import dwt.widgets.Display;
> import dwt.widgets.List;
> import dwt.widgets.Shell;
>
> import tango.core.Thread;
> import tango.time.WallClock;
> import tango.util.Convert;
> import tango.io.Stdout;
>
> import dwt.dwthelper.utils;
>
>
> /**
> * @author tenyears.cn
> */
> public class SWTThread {
> private int size = 10; //
> private long runTime = 50000; // 50 seconds
> private List list;
> private Shell shell;
>
> void dgRefresh()
> {
> Thread thread = new Thread( {new RunOne();} );
> thread.start();
> }
>
> class RunOne : Runnable
> {
> uint i;
> void run()
> {
> long start = WallClock.now.span.millis;
> shell.setText( "wait " ~ to!(String)(i++) );
> while ((WallClock.now.span.millis() - start) < runTime)
> {
> shell.setText( "wait " ~ to!(String)(i++) );
> Thread.sleep(10);
> }
> }
> }
>
> public void startThread()
> {
> try
> {
> Runnable refresh = dgRunnable(&dgRefresh);
> BusyIndicator.showWhile(shell.getDisplay(), refresh);//ÕâÒ»¾äºÜ¹Ø¼ü
> }
> catch(Exception e)
> {Stdout.formatln("startThread catch {}", e.msg);}
> }
>
>
> void onStartBtn(Event event)
> {
> try
> {
> startThread();
> }
> catch(Exception e)
> {Stdout.formatln("onStartBtn catch {}", e.msg);}
>
> }
>
> public Shell open(Display display)
> {
> shell = new Shell(display, DWT.DIALOG_TRIM | DWT.MIN);
> shell.setText("SWT Thread Test");
> shell.setLayout(new GridLayout(1, true));
> list = new List(shell, DWT.BORDER);
> list.setLayoutData(new GridData(DWT.FILL, DWT.FILL, true, true));
> for (int index = 0; index < size; index++)
> list.add("String " ~ to!(String) (index + 1));
> Button startBtn = new Button(shell, DWT.PUSH);
> startBtn.setLayoutData(new GridData(DWT.FILL, DWT.CENTER, true,
> false));
> startBtn.setText("Start");
>
> startBtn.addListener(DWT.Selection, dgListener(&onStartBtn));
> shell.setSize(400, 300);
> shell.open();
> return shell;
> }
>
>
> }
>
> public void main(String[] args) {
> Display display = new Display();
> SWTThread application = new SWTThread();
> Shell shell = application.open(display);
> while (!shell.isDisposed()) {
> if (!display.readAndDispatch())
> display.sleep();
> }
> display.dispose();
> }
>
>
> SWT code: http://blog.csdn.net/baobeiSimple/archive/2007/08/22/1753910.aspx
>
>
>
>
> --
> yidabu <yidabu.spam@gmail.com> http://www.dsource.org/projects/dwin
>
> D ÓïÑÔ-ÖÐÎÄ(D Chinese): http://www.d-programming-language-china.org/ http://bbs.d-programming-language-china.org/ http://dwin.d-programming-language-china.org/ http://scite4d.d-programming-language-china.org/
>
>
|
October 31, 2008 Re: DWT multi thread issue | ||||
---|---|---|---|---|
| ||||
Posted in reply to Frank Benoit | On Fri, 31 Oct 2008 07:56:53 -0400 Frank Benoit <keinfarbton@googlemail.com> wrote: > I cannot try it right now, but perhaps this works? : > > void dgRefresh() > { > auto runOne = new RunOne(); > Thread thread = new Thread( &runOne.run ); > thread.start(); > } > code works: void dgRefresh() { auto runOne = new RunOne(); Thread thread = new Thread( &runOne.run ); thread.start(); } class RunOne : Runnable { uint i; void run() { Stdout("RunOne.run").newline; long start = WallClock.now.span.millis; void dgSetText(String text) { shell.setText(text); } while ((WallClock.now.span.millis() - start) < runTime) { auto text = "wait " ~ to!(String)(i++); shell.getDisplay.syncExec( dgRunnable(&dgSetText, text) ); Thread.sleep(1); } } } My question is : in dwt-samples\user\torhu_synctest.d, code works: auto t = new Thread({Display.getDefault.syncExec(new class Runnable { void run() { txt.setText("inside syncExec"); } });}); where code here not work: void dgRefresh() { auto runOne = new RunOne(); Thread thread = new Thread( { shell.getDisplay.syncExec(runOne); } ); thread.start(); } -- yidabu <yidabu.spam@gmail.com> http://www.dsource.org/projects/dwin D 语言-中文(D Chinese): http://www.d-programming-language-china.org/ http://bbs.d-programming-language-china.org/ http://dwin.d-programming-language-china.org/ http://scite4d.d-programming-language-china.org/ |
October 31, 2008 Re: DWT multi thread issue | ||||
---|---|---|---|---|
| ||||
Posted in reply to Eric Suen | On Sat, 1 Nov 2008 01:09:58 +0800 "Eric Suen" <eric.suen.tech@gmail.com> wrote: > shell.setText( "wait " ~ to!(String)(i++) ); > > only works on GUI thread, otherwise it will throw exception, > > you should using display.synExec(...); make sure it be called > in GUI thread. Thanks. > > -- > > yidabu <yidabu.spam@gmail.com> http://www.dsource.org/projects/dwin > > > > D 语言-中文(D Chinese): http://www.d-programming-language-china.org/ http://bbs.d-programming-language-china.org/ http://dwin.d-programming-language-china.org/ http://scite4d.d-programming-language-china.org/ > > > > > > -- yidabu <yidabu.spam@gmail.com> http://www.dsource.org/projects/dwin D 语言-中文(D Chinese): http://www.d-programming-language-china.org/ http://bbs.d-programming-language-china.org/ http://dwin.d-programming-language-china.org/ http://scite4d.d-programming-language-china.org/ |
November 01, 2008 Re: DWT multi thread issue | ||||
---|---|---|---|---|
| ||||
Posted in reply to yidabu | DWT multi thread sample: import dwt.DWT; import dwt.widgets.Listener; import dwt.widgets.Event; import dwt.custom.BusyIndicator; import dwt.events.SelectionAdapter; import dwt.events.SelectionEvent; import dwt.layout.GridData; import dwt.layout.GridLayout; import dwt.widgets.Button; import dwt.widgets.Display; import dwt.widgets.Shell; import tango.core.Thread; import tango.time.WallClock; import tango.util.Convert; import tango.io.Stdout; import dwt.dwthelper.utils; import dwt.dwthelper.Runnable; /** * @author tenyears.cn * ported to D by D China * http://www.d-programming-language-china.org/ * http://bbs.d-programming-language-china.org/ */ public class SWTThread { private long runTime = 50000; // 50 seconds private Shell shell; void dgRefresh() { Thread thread = new Thread( &setGuiText ); thread.start(); } void setGuiText() { uint i; long start = WallClock.now.span.millis; void dgSetText(String text) { shell.setText(text); } while ((WallClock.now.span.millis() - start) < runTime) { auto text = "wait " ~ to!(String)(i++); shell.getDisplay.syncExec( dgRunnable(&dgSetText, text) ); Thread.sleep(1); } } public void startThread() { try { Runnable refresh = dgRunnable(&dgRefresh); BusyIndicator.showWhile(shell.getDisplay(), refresh);//这一句很关键 } catch(Exception e) {Stdout.formatln("startThread catch {}", e.msg);} } void onStartBtn(Event event) { try { startThread(); } catch(Exception e) {Stdout.formatln("onStartBtn catch {}", e.msg);} } public Shell open(Display display) { shell = new Shell(display, DWT.DIALOG_TRIM | DWT.MIN); shell.setText("SWT Thread Test"); shell.setLayout(new GridLayout(1, true)); Button startBtn = new Button(shell, DWT.PUSH); startBtn.setLayoutData(new GridData(DWT.FILL, DWT.CENTER, true, false)); startBtn.setText("Start"); startBtn.addListener(DWT.Selection, dgListener(&onStartBtn)); shell.setSize(400, 300); shell.open(); return shell; } } public void main(String[] args) { Display display = new Display(); SWTThread application = new SWTThread(); Shell shell = application.open(display); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } -- yidabu <yidabu.spam@gmail.com> http://www.dsource.org/projects/dwin D 语言-中文(D Chinese): http://www.d-programming-language-china.org/ http://bbs.d-programming-language-china.org/ http://dwin.d-programming-language-china.org/ http://scite4d.d-programming-language-china.org/ |
Copyright © 1999-2021 by the D Language Foundation