Async messages to a thread.

John Colvin john.loughran.colvin at gmail.com
Mon Jul 29 09:02:42 PDT 2013


On Monday, 29 July 2013 at 15:28:45 UTC, lindenk wrote:
> Hello!
> This is partially a general question as I don't know what this 
> is called or if it exists. Say for example I want to do 
> something like the following -
>
> import std.concurrency;
>
> void main()
> {
>     void foo() {
>         try
>         {
>             while(true)
>             {
>                  do_some_blocking_function();
>             }
>         } catch(GotAMessage msg){}
>
>         // clean up
>     };
>
>     tid = spawn(&foo, thisTid);
>
>     // do stuff / wait for some condition
>
>     send(tid, "STAHP!");
> }
>
> One solution I've used in the past is setting a timeout for the 
> blocking function then polling to see if the thread should 
> exit. The disadvantage is it causes extra, unnecessary checking 
> and has a delay before it gets the message and exits.
>
> This is a fairly simple example but the idea should be the 
> same, is there a way to pass a message or signal to a thread to 
> cause it to branch to some other location?

import std.concurrency;
import core.time;

void foo(Tid parent) {
     bool run = true;
     while(run)
     {
          //do_some_blocking_function();
          receiveTimeout(dur!"msecs"(0),
              (string s){if(s == "STAHP!") run = false;}
          );
     }

     // clean up
     send(parent, "done");
}


void main()
{
     auto tid = spawn(&foo, thisTid);

     // do stuff / wait for some condition

     send(tid, "STAHP!");
     auto msg = receiveOnly!(string)();
     assert(msg == "done");
}


More information about the Digitalmars-d-learn mailing list