Possible to pass a member function to spawn?

Oliver Puerto saxo123 at gmx.de
Mon Feb 6 13:38:03 PST 2012


Hello,

I'm very new to D. Just started reading "The D programming language". I should read it from beginning to end before posting questions here. I know ... But I'm just too impatient. The issue seems not to be that simple, nevertheless. The code below compiles with Visual Studio.

I want to have something like my actor class that I can start running in it's own thread like in Scala or other languages that support actors. So at best, I would like to do something like this:

    MyActor myActor = new MyActor();
    auto tid = spawn(&start, &myActor.run());

However, this doesn't work. So I came up with the solution below where the start function is called with myActor as an argument. The code at the end of the mail prints this to the console:

MyActor 123
tid
Main thread received message: -1

This solution works, but is really not very elegant. I'm not sure whether declaring MyActor shared is a good solution. The minimum I would like to achieve is to have the start function in the source file with the MyActor class. Also this does not compile. I played with delegates but couldn't get it to compile.

I'd be thankful for any useful suggestions or hints.

Regards, Oliver Plow

-------------------- beginning of main.d -------------- 

import MyActor;

int main()
{

    MyActor myActor = new MyActor();
    auto tid = spawn(&start, myActor); 

    tid.send(123);
    tid.send(thisTid);

    receive( 
       (int x) {
        writeln("Main thread received message: ", x);
       });

    return 0;
}


void start(MyActor actor)
{
    bool cont = true;

    while (cont)
    {
        receive( 
            (int msg) { actor.run(msg); },
            (Tid sender) { cont = false; sender.send(-1); },
	    (Variant v) { writeln("huh?"); } 
	);
    }
}

-------------------- end of main.d -------------- 


-------------------- beginning of MyActor.d -------------- 

shared class MyActor {

    void run(int i) {
        write("MyActor ");
	write(i);
	write("\n");
    }

}

-------------------- end of MyActor.d --------------


-- 
Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir
belohnen Sie mit bis zu 50,- Euro! https://freundschaftswerbung.gmx.de


More information about the Digitalmars-d mailing list