digitalmars.D.dwt - DWT multi thread issue
- yidabu (109/109) Oct 31 2008 I ported a SWT multi thread sample to D, but it not worked, and body hel...
- Frank Benoit (7/7) Oct 31 2008 I cannot try it right now, but perhaps this works? :
- yidabu (52/61) Oct 31 2008 code works:
- Eric Suen (4/110) Oct 31 2008 shell.setText( "wait " ~ to!(String)(i++) );
- yidabu (11/30) Oct 31 2008 Thanks.
- yidabu (105/105) Oct 31 2008 DWT multi thread sample:
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/
Oct 31 2008
I cannot try it right now, but perhaps this works? :
void dgRefresh()
{
auto runOne = new RunOne();
Thread thread = new Thread( &runOne.run );
thread.start();
}
Oct 31 2008
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/
Oct 31 2008
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/
Oct 31 2008
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/
Oct 31 2008
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/
Oct 31 2008









yidabu <yidabu.spam gmail.com> 