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