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 :
