Use interface to manage object life cycle

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2575 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
inoussa
2012-10-22 13:41:11 +00:00
parent 7d73bd43ac
commit 8357cd9d78

View File

@ -22,9 +22,14 @@ uses
type type
IObjectRef = interface
['{B62EC733-999D-4DEC-A69F-B7546A16F661}']
function GetObject() : TObject;
end;
{ TFPWorkerObject } { TFPWorkerObject }
TFPWorkerObject = class TFPWorkerObject = class(TInterfacedObject,IObjectRef)
private private
FHTTPServerObject: TFPHTTPServer; FHTTPServerObject: TFPHTTPServer;
FRootAddress : string; FRootAddress : string;
@ -52,6 +57,8 @@ type
Var ARequest : TFPHTTPConnectionRequest; Var ARequest : TFPHTTPConnectionRequest;
Var AResponse : TFPHTTPConnectionResponse Var AResponse : TFPHTTPConnectionResponse
); );
protected
function GetObject() : TObject;
public public
constructor Create(); constructor Create();
destructor Destroy(); override; destructor Destroy(); override;
@ -70,7 +77,7 @@ type
TServerListnerThread = class(TThread) TServerListnerThread = class(TThread)
private private
FWorkerObject : TFPWorkerObject; FWorkerObject : IObjectRef;
public public
constructor Create(AWorkerObject : TFPWorkerObject); constructor Create(AWorkerObject : TFPWorkerObject);
procedure Execute(); override; procedure Execute(); override;
@ -84,6 +91,7 @@ type
TwstFPHttpListener = class(TwstListener) TwstFPHttpListener = class(TwstListener)
private private
FOptions : TListenerOptions; FOptions : TListenerOptions;
FWorkerObjectRef : IObjectRef;
FWorkerObject : TFPWorkerObject; FWorkerObject : TFPWorkerObject;
protected protected
procedure SetOnNotifyMessage(const AValue : TListnerNotifyMessage);override; procedure SetOnNotifyMessage(const AValue : TListnerNotifyMessage);override;
@ -141,14 +149,17 @@ end;
constructor TServerListnerThread.Create(AWorkerObject : TFPWorkerObject); constructor TServerListnerThread.Create(AWorkerObject : TFPWorkerObject);
begin begin
FreeOnTerminate := True; FreeOnTerminate := True;
FWorkerObject := AWorkerObject; FWorkerObject := AWorkerObject as IObjectRef;
inherited Create(False); inherited Create(False);
end; end;
procedure TServerListnerThread.Execute(); procedure TServerListnerThread.Execute();
var
locObject : TFPWorkerObject;
begin begin
try try
FWorkerObject.Start(); locObject := TFPWorkerObject(FWorkerObject.GetObject());
locObject.Start();
except except
end; end;
end; end;
@ -262,6 +273,11 @@ begin
end; end;
end; end;
function TFPWorkerObject.GetObject : TObject;
begin
Result := Self;
end;
procedure TFPWorkerObject.SetHandleRequestInThread(const AValue : Boolean); procedure TFPWorkerObject.SetHandleRequestInThread(const AValue : Boolean);
begin begin
if FHTTPServerObject.Active then if FHTTPServerObject.Active then
@ -326,7 +342,8 @@ constructor TwstFPHttpListener.Create(
begin begin
inherited Create(); inherited Create();
FWorkerObject := TFPWorkerObject.Create(); FWorkerObjectRef := TFPWorkerObject.Create() as IObjectRef;
FWorkerObject := TFPWorkerObject(FWorkerObjectRef.GetObject());
FWorkerObject.RootAddress := AServerIpAddress; FWorkerObject.RootAddress := AServerIpAddress;
FWorkerObject.ServerSoftware := AServerSoftware; FWorkerObject.ServerSoftware := AServerSoftware;
FWorkerObject.ListeningPort := AListningPort; FWorkerObject.ListeningPort := AListningPort;
@ -336,7 +353,7 @@ destructor TwstFPHttpListener.Destroy();
begin begin
if (FWorkerObject <> nil) then if (FWorkerObject <> nil) then
Stop(); Stop();
FreeAndNil(FWorkerObject); FWorkerObjectRef := nil;
inherited Destroy(); inherited Destroy();
end; end;