ProgressMonitorDialog : Access Violation
yidabu
yidabu.spam at gmail.com
Sat Jun 21 15:53:29 PDT 2008
On Sat, 21 Jun 2008 15:35:33 +0200
Frank Benoit <keinfarbton at googlemail.com> wrote:
> Frank Benoit schrieb:
> > i had tested it with dmd 1.031 ... and indeed with dmd 1.028 it crashes.
> > Your first example code should work now.
> > With the
> > > dialog.run(false, true, dgIRunnableWithProgress(&run));
> > there is still a problem :/
>
> Now it works with fork=false, but another anon class workaround was
> necessary.
>
> Also a fix in the example code is needed to make fork=false work. From
> the ProgressMonitorDialog doc:
> If fork is set to false, the runnable will run in the UI thread and it
> is the runnable's responsibility to call Display.readAndDispatch() to
> ensure UI responsiveness.
>
> The example code looks now like this:
>
> import dwt.DWT;
> import dwt.layout.FillLayout;
> import dwt.widgets.Display;
> import dwt.widgets.Shell;
> import dwt.widgets.Listener;
> import dwt.widgets.Event;
> import dwt.widgets.Button;
>
> import dwtx.jface.dialogs.PopupDialog;
> import dwt.dwthelper.utils;
>
> import dwtx.jface.dialogs.ProgressMonitorDialog;
> import dwtx.core.runtime.IProgressMonitor;
> import dwtx.jface.operation.IRunnableWithProgress;
>
> import tango.core.Thread;
>
> version=NOFORK;
>
> void handleSelection(Event e, Shell shell) {
> void run(IProgressMonitor monitor) {
> monitor.beginTask("generate", 30);
> for(int i=0; i<100; i++) {
> if(monitor.isCanceled()) {
> return;
> }
> monitor.worked(1);
> Thread.sleep(0.050);
> version(NOFORK) Display.getCurrent().readAndDispatch();
> }
> monitor.done();
> version(NOFORK) Display.getCurrent().readAndDispatch();
> }
> auto dialog = new ProgressMonitorDialog(shell);
> version(NOFORK) {
> dialog.run(false, true, dgIRunnableWithProgress(&run));
> } else {
> dialog.run(true, true, dgIRunnableWithProgress(&run));
> }
> }
>
> void main() {
> final Display display = new Display();
> final Shell shell = new Shell(display);
> shell.setLayout(new FillLayout());
> Button button = new Button(shell, DWT.PUSH);
> button.setText("&OK");
>
> button.addListener(DWT.Selection,
> dgListener(&handleSelection, shell));
>
> shell.pack();
> shell.open();
> while (!shell.isDisposed()) {
> if (!display.readAndDispatch()) display.sleep();
> }
> display.dispose();
> }
>
thanks a lot!
--
yidabu <yidabu.spam at 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/
More information about the Digitalmars-d-dwt
mailing list