| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- {
- $Project$
- $Workfile$
- $Revision$
- $DateUTC$
- $Id$
- This file is part of the Indy (Internet Direct) project, and is offered
- under the dual-licensing agreement described on the Indy website.
- (http://www.indyproject.org/)
- Copyright:
- (c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
- }
- {
- $Log$
- }
- {
- Rev 1.2 2003.11.04 3:49:00 PM czhower
- Update to sync TC
- Rev 1.1 2003.10.21 12:19:02 AM czhower
- TIdTask support and fiber bug fixes.
- }
- unit IdTask;
- interface
- {$i IdCompilerDefines.inc}
- uses
- {$IFDEF USE_OBJECT_ARC}
- IdGlobal,
- {$ENDIF}
- IdYarn,
- SysUtils;
- type
- TIdTask = class(TObject)
- protected
- FBeforeRunDone: Boolean;
- {$IFDEF USE_OBJECT_ARC}
- // When ARC is enabled, object references MUST be valid objects.
- // It is common for users to store non-object values, though, so
- // we will provide separate properties for those purposes
- //
- // TODO; use TValue instead of separating them
- //
- FDataObject: TObject;
- FDataValue: PtrInt;
- {$ELSE}
- FData: TObject;
- {$ENDIF}
- FYarn: TIdYarn;
- //
- procedure AfterRun; virtual;
- procedure BeforeRun; virtual;
- function Run: Boolean; virtual; abstract;
- procedure HandleException(AException: Exception); virtual;
- public
- constructor Create(
- AYarn: TIdYarn
- ); reintroduce; virtual;
- destructor Destroy; override;
- // The Do's are separate so we can add events later if necessary without
- // needing the inherited calls to perform them, as well as allowing
- // us to keep the real runs as protected
- procedure DoAfterRun;
- procedure DoBeforeRun;
- function DoRun: Boolean;
- procedure DoException(AException: Exception);
- // BeforeRunDone property to allow flexibility in alternative schedulers
- property BeforeRunDone: Boolean read FBeforeRunDone;
- //
- {$IFDEF USE_OBJECT_ARC}
- property DataObject: TObject read FDataObject write FDataObject;
- property DataValue: PtrInt read FDataValue write FDataValue;
- {$ELSE}
- property Data: TObject read FData write FData;
- {$ENDIF}
- property Yarn: TIdYarn read FYarn;
- end;
- implementation
- {$IFNDEF USE_OBJECT_ARC}
- uses
- IdGlobal;
- {$ENDIF}
- { TIdTask }
- procedure TIdTask.AfterRun;
- begin
- end;
- procedure TIdTask.BeforeRun;
- begin
- end;
- procedure TIdTask.HandleException(AException: Exception);
- begin
- end;
- constructor TIdTask.Create(AYarn: TIdYarn);
- begin
- inherited Create;
- FYarn := AYarn;
- FBeforeRunDone := False;
- end;
- destructor TIdTask.Destroy;
- begin
- // Dont free the yarn, that is the responsibilty of the thread / fiber.
- // .Yarn here is just a reference, not an ownership
- FreeAndNil({$IFDEF USE_OBJECT_ARC}FDataObject{$ELSE}FData{$ENDIF});
- {$IFDEF USE_OBJECT_ARC}
- FDataValue := 0;
- {$ENDIF}
- inherited Destroy;
- end;
- procedure TIdTask.DoAfterRun;
- begin
- AfterRun;
- end;
- procedure TIdTask.DoBeforeRun;
- begin
- FBeforeRunDone := True;
- BeforeRun;
- end;
- function TIdTask.DoRun: Boolean;
- begin
- Result := Run;
- end;
- procedure TIdTask.DoException(AException: Exception);
- begin
- HandleException(AException);
- end;
- end.
|