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