Thread overview
Thread.start doesn't work?
Jul 31, 2008
Plumm
Jul 31, 2008
Frank Benoit
Aug 01, 2008
Plumm
Aug 01, 2008
Frank Benoit
Aug 01, 2008
Plumm
Aug 01, 2008
Frank Benoit
Aug 01, 2008
Plumm
Aug 04, 2008
Sean Kelly
July 31, 2008
Hi:

  I just tried a DWT problem with a heavy file processing bound to a button.That's why I chose to use Thread, or the background thread/GUI thread would be locked and no refresh.

  The problem is the thread seems do nothing. And even the isRunning returns false right after calling start.

  The environment is dwt-win 3.4.1 with tango 0.99.7 / DMD 1.033 which is right the version downloaded from the DWT download page.

  Thanks for any answer.
July 31, 2008
Plumm schrieb:
> Hi:
> 
>   I just tried a DWT problem with a heavy file processing bound to a button.That's why I chose to use Thread, or the background thread/GUI thread would be locked and no refresh.
> 
>   The problem is the thread seems do nothing. And even the isRunning returns false right after calling start.
> 
>   The environment is dwt-win 3.4.1 with tango 0.99.7 / DMD 1.033 which is right the version downloaded from the DWT download page.
> 
>   Thanks for any answer.

can you post your code?
Does your thread start if you execute the button handler code without GUI?
August 01, 2008
The code is as follows: The problem is if some exception happens, it should open up a messagebox(messagebox works without being inside a thread), and I haven't tested the code without the DWT environment, but I think it might be the Tango problem, not the DWT problem. This code works if it's not in a thread though.

and there is a thread.start() right after the Thread definition. Note : text_file_input, text_file_output, button_convert, and thread are all declared as static scope.

           thread = new Thread(
           {
             int int_lines = 0;
             FileConduit file_input  = null;
             FileConduit file_output = null;
             DataOutput  file_out    = null;

             try
             {
               file_input  = new FileConduit (text_file_input.getText());
               file_output = new FileConduit (text_file_output.getText(), FileConduit.WriteCreate);
               file_out    = new DataOutput (file_output);

               foreach (str_line; new LineInput(file_input))
               {
                 int_lines++;

                 int int_last_index = 0;
                 foreach ( int_index, int_item ; int_idn_locations)
                 {
                   int int_item1 = int_item -1 ;

                   if (int_item1 + 10 > str_line.length)
                     break;

                   if ((int_item1 != 0) && (int_last_index != int_item1))
                     file_out.write (str_line[int_last_index..int_item1]);

                   if (str_line[int_item1..int_item1+10] != "          ")
                     file_out.write(cjidn_encode(str_line[int_item1..int_item1+10]));
                   else
                     file_out.write(cast(char[])("          "));

                   int_last_index = int_item1 + 10;
                 }
                 file_out.write(str_line[int_last_index..length]);
                 file_out.write("\r\n");

                 Thread.sleep(0.001);
               }

               auto sprint0 = new Sprint!(char);
               MessageBox messageBox0 = new MessageBox(DWT.OK|DWT.ICON_INFORMATION);
               messageBox0.setText("Done");
               messageBox0.setMessage(sprint0("{} Lines", int_lines));
               messageBox0.open();
             }
             catch (Exception o)
             {
               auto sprint = new Sprint!(char);
               MessageBox messageBox = new MessageBox(DWT.OK|DWT.ICON_ERROR);
               messageBox.setText("Error");
               messageBox.setMessage(sprint("Error : {}", o.msg));
               messageBox.open();
             }
             finally
             {
               if (!(file_out is null))
                 file_out.flush();
               if (!(file_output is null))
                 file_output.close();
               if (!(file_input is null))
                 file_input.close();
               button_convert.setEnabled(true);
             }
           });
August 01, 2008
Plumm schrieb:
> The code is as follows: The problem is if some exception happens, it
> should open up a messagebox(messagebox works without being inside a
> thread), and I haven't tested the code without the DWT environment,
> but I think it might be the Tango problem, not the DWT problem. This
> code works if it's not in a thread though.
> 


It is not allowed to access any DWT function from a thread that is not the "GUI thread". The calls to MessageBox in the thread might throw exception, because they detect an illegal thread access.

To solve this, there is Display.syncExec and asyncExec.

Display.getCurrent().syncExec( dgRunnable({
               MessageBox messageBox0 = new MessageBox(DWT.OK|DWT.ICON_INFORMATION);
               messageBox0.setText("Done");
               messageBox0.setMessage(sprint0("{} Lines", int_lines));
               messageBox0.open();

}));
August 01, 2008
Thanks for the response.

However, I think it's the problem that threading doesn't work. Even if I remove everything in the thread and simply but a static variable change in the thread. It's not executed either.

A bit wierd....
August 01, 2008
Plumm schrieb:
> Thanks for the response.
> 
> However, I think it's the problem that threading doesn't work. Even if I remove everything in the thread and simply but a static variable change in the thread. It's not executed either.
> 
> A bit wierd....

ok, i would like to take a look at your problem.
But i would need a simple to compile and execute example.
August 01, 2008
Ignore the previous post...I made a mistake by creating a new class that extends Thread overriding the run function.

And now it works. Problem solved...

Thanks for the help.
August 04, 2008
Plumm wrote:
> Ignore the previous post...I made a mistake by creating a new class that extends Thread overriding the run function. 

Thread.run is private, it can't be overridden :-)

> And now it works. Problem solved...

Glad to hear it.


Sean