![]() |
Stateless - StateMachine für Delphi
Unter
![]() ![]() Unittests und Beispiele inklusive. Der Code sollte ab Delphi XE2+ einfach so verwendet werden können. Hier ein kleines Beispiel
Delphi-Quellcode:
Und die Ausgabe:
program PhoneCall;
{$APPTYPE CONSOLE} {$R *.res} uses System.Diagnostics, System.SysUtils, Stateless; {$SCOPEDENUMS ON} type State = ( OffHook, Ringing, Connected, Active, OnHold, PhoneDestroyed ); Trigger = ( CallDialed, HungUp, CallConnected, LeftMessage, PlacedOnHold, TakenOffHold, PhoneHurledAgainstWall ); TPhoneCall = TStateMachine<State, Trigger>; procedure ConfigurePhoneCall( PhoneCall: TPhoneCall ); var LCallTimer: TStopwatch; begin PhoneCall.Configure( State.OffHook ) {} .Permit( Trigger.CallDialed, State.Ringing ); PhoneCall.Configure( State.Ringing ) {} .Permit( Trigger.HungUp, State.OffHook ) {} .Permit( Trigger.CallConnected, State.Active ); PhoneCall.Configure( State.Connected ) {} .Permit( Trigger.HungUp, State.OffHook ) {} .OnEntry( procedure( t: TPhoneCall.TTransition ) begin LCallTimer := TStopwatch.StartNew; end ) {} .OnExit( procedure( t: TPhoneCall.TTransition ) begin LCallTimer.Stop; WriteLn( 'Duration: ', LCallTimer.ElapsedMilliseconds, 'ms' ); end ); PhoneCall.Configure( State.Active ) {} .SubstateOf( State.Connected ) {} .Permit( Trigger.LeftMessage, State.OffHook ) {} .Permit( Trigger.PlacedOnHold, State.OnHold ); PhoneCall.Configure( State.OnHold ) {} .SubstateOf( State.Connected ) {} .Permit( Trigger.TakenOffHold, State.Active ) {} .Permit( Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed ); end; procedure Test; var LCall: TPhoneCall; begin LCall := TPhoneCall.Create( State.OffHook ); try ConfigurePhoneCall( LCall ); WriteLn( LCall.ToString ); LCall.Fire( Trigger.CallDialed ); WriteLn( LCall.ToString ); LCall.Fire( Trigger.CallConnected ); WriteLn( LCall.ToString ); LCall.Fire( Trigger.PlacedOnHold ); WriteLn( LCall.ToString ); LCall.Fire( Trigger.TakenOffHold ); WriteLn( LCall.ToString ); LCall.Fire( Trigger.PlacedOnHold ); WriteLn( LCall.ToString ); LCall.Fire( Trigger.HungUp ); WriteLn( LCall.ToString ); finally LCall.Free; end; end; begin try Test; except on E: Exception do WriteLn( E.ClassName, ': ', E.Message ); end; ReadLn; end.
Code:
StateMachine { State = OffHook, PermittedTriggers = { CallDialed } }
StateMachine { State = Ringing, PermittedTriggers = { HungUp, CallConnected } } StateMachine { State = Active, PermittedTriggers = { PlacedOnHold, LeftMessage, HungUp } } StateMachine { State = OnHold, PermittedTriggers = { TakenOffHold, PhoneHurledAgainstWall, HungUp } } StateMachine { State = Active, PermittedTriggers = { PlacedOnHold, LeftMessage, HungUp } } StateMachine { State = OnHold, PermittedTriggers = { TakenOffHold, PhoneHurledAgainstWall, HungUp } } Duration: 0ms StateMachine { State = OffHook, PermittedTriggers = { CallDialed } } |
AW: Stateless - StateMachine für Delphi
|
AW: Stateless - StateMachine für Delphi
Thank you very much !!!
I was awaiting this eagerly ... :-D Question (at the moment, I did not look closely into the sources): Would a port to Free Pascal be possible / difficult / useless ? Thanks, Alfred. |
AW: Stateless - StateMachine für Delphi
I guess it's not impossible but because it uses delphi generics and rtti excessively many adaption may be made.
But I haven't had a very close look neither. |
AW: Stateless - StateMachine für Delphi
I just had a look at the sources!
FPC is not possible at the moment. It uses nested generics, and current FPC cannot handle this. E.g.: FTriggerBehaviours: TObjectDictionary<TTrigger, TObjectList<TTriggerBehaviour>>; But few months ago, I did port the same statemachine to FPC. I will have a look and check again against Sir Rufo's and make public if ok ! |
AW: Stateless - StateMachine für Delphi
Zitat:
Wenn das mal komplett ist, dann geht das auch zu Delphinus ... :) |
AW: Stateless - StateMachine für Delphi
Zitat:
|
AW: Stateless - StateMachine für Delphi
Da bist du mir zuvor gekommen - wollte schon seit einiger Zeit eine Statemachine in Spring4D einfügen - Stateless war auch eins meiner möglichen Vorlagen.
|
AW: Stateless - StateMachine für Delphi
Mal eine Doofe Frage, was macht man damit und was tut das.
|
AW: Stateless - StateMachine für Delphi
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz