V2 Release of Pascal Actor Model is done.

I am now im the process of adding UDP message streaming support.

This will allow multithreading to include threads running in other
computers on the same broadcast domain.

Actor is a thread of sorts (it IS a thread but with some specific
semantic rules that comprises the actor model :
http://en.wikipedia.org/wiki/Actor_model)

Messages are objects sent from an actor to another.

In a program hosted in a single computer the messages are objects sent
to/from actors.

When the message needs to jump from a computer to another, the message
object is streamed into a string and sent via UDP, destreamed at
target and injected in the correct actor message queue.

The main program can send/receive messages too (via the mainthreadqueue).

Example program :

Uses
        {$IFDEF UNIX}
        CThreads,
        {$ENDIF}
        Classes,
        SysUtils,
        Actors,
        ActorMessages,
        ActorLogger,
        CustomActors;

Type
        TScreenMessage = Class(TCustomStringActorMessage);

        TScreenWriterActor = Class(TActorThread)
        Public
                Procedure ScreenWrite(Var aMessage); Message 'tscreenmessage';
        End;

Procedure TScreenWriterActor.ScreenWrite(Var aMessage);
Var
        lMessage : TScreenMessage;
Begin
        lMessage := UnbundleMessage(aMessage) As TScreenMessage;
        WriteLn(ActorName, ': ', lMessage.Data);
End;

Var
        gBuffer : String;
        gScreenMessage : TScreenMessage;

Begin
        DefaultActorMessageTTL := 1000000; // things are rough at startup,
lets make messages float around forever
        Actors.Init('localhost', 'switchboard');
        ActorLogger.Init;
        CustomActors.Init;
        ActorMessageClassFactory.RegisterMessage(TScreenMessage);
        RegisterActorClass(TScreenWriterActor);
        StartActorInstance('TScreenWriterActor', 'screen1');
        StartActorInstance('TScreenWriterActor', 'screen2');
        StartActorInstance('TScreenWriterActor', 'screen3');
        StartActorInstance('TLoadBalancerActor', 'screen');
        AddTargetToActor('screen', 'screen1');
        AddTargetToActor('screen', 'screen2');
        AddTargetToActor('screen', 'screen3');
        DefaultActorMessageTTL := 5; // everything should be quick from now on.
        Repeat
                Write('Input something : '); ReadLn(gBuffer);
                If gBuffer <> 'quit' Then
                Begin
                        gScreenMessage := TScreenMessage.Create('localhost', 
'screen');
                        gScreenMessage.Data := gBuffer;
                        Switchboard.Mailbox.Push(gScreenMessage);
                End;
        Until gBuffer = 'quit';
        CustomActors.Fini;
        ActorLogger.Fini;
        Actors.Fini;
End.

Project is stored at :

https://code.google.com/p/pascal-actor-model/
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to