Changeset 3 for trunk/UKernel.pas


Ignore:
Timestamp:
Nov 22, 2014, 11:50:49 PM (9 years ago)
Author:
chronos
Message:
  • Added: Application is executed as Task by Scheduler. OS threads is used for scheduler for efficient execution.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UKernel.pas

    r2 r3  
    99
    1010type
     11  TEvent = procedure of object;
    1112
    1213  TTaskState = (tsStopped, tsRunning, tsSuspended);
    1314
    14   TTask = class
     15  { TTask }
     16
     17  TTask = class(TNamedObject)
    1518    Name: string;
    1619    State: TTaskState;
     20    EntryPoint: TEvent;
     21    constructor Create; virtual;
    1722  end;
    1823
    19   TTasks = class(TObjectList)
     24  TTaskClass = class of TTask;
    2025
     26  { TScheduler }
     27
     28  TScheduler = class
     29    TaskClass: TTaskClass;
     30    Tasks: TNamedObjectList; // TList<TTask>
     31    Running: Boolean;
     32    procedure Start; virtual;
     33    procedure Stop;
     34    function AddTask(Name: string; EntryPoint: TEvent): TTask; virtual;
     35    constructor Create; virtual;
     36    destructor Destroy; override;
    2137  end;
    2238
    23   TScheduler = class
    24     Tasks: TTasks;
    25   end;
     39  TSchedulerClass = class of TScheduler;
    2640
    2741  TDrive = class(TNamedObject)
     
    3448    Apps: TNamedObjectList; // TList<TApp>
    3549    Drives: TNamedObjectList; // TList<TDrive>
    36     procedure Execute(AFile: TFile);
     50    Scheduler: TScheduler;
     51    SchedulerClass: TSchedulerClass;
     52    FileSystemClass: TFileSystemClass;
     53    procedure AppExecute(AFile: TFile);
    3754    procedure Init;
    3855    procedure Run;
     
    4360implementation
    4461
    45 uses
    46   UPlatformBase;
     62{ TTask }
     63
     64constructor TTask.Create;
     65begin
     66
     67end;
     68
     69{ TScheduler }
     70
     71procedure TScheduler.Start;
     72begin
     73  Running := True;
     74end;
     75
     76procedure TScheduler.Stop;
     77begin
     78  Running := False;
     79end;
     80
     81function TScheduler.AddTask(Name: string; EntryPoint: TEvent): TTask;
     82var
     83  NewTask: TTask;
     84begin
     85  NewTask := TaskClass.Create;
     86  NewTask.Name := Name;
     87  NewTask.EntryPoint := EntryPoint;
     88  Tasks.Add(NewTask);
     89  Result := NewTask;
     90end;
     91
     92constructor TScheduler.Create;
     93begin
     94  TaskClass := TTask;
     95  Tasks := TNamedObjectList.Create;
     96end;
     97
     98destructor TScheduler.Destroy;
     99begin
     100  if Running then Stop;
     101  Tasks.Free;
     102  inherited Destroy;
     103end;
    47104
    48105{ TKernel }
    49106
    50 procedure TKernel.Execute(AFile: TFile);
     107procedure TKernel.AppExecute(AFile: TFile);
    51108var
    52109  App: TApp;
    53110begin
    54111  App := TApp(Apps.FindByName(AFile.Name));
    55   if Assigned(App) then App.Run
    56     else raise Exception.Create('Application ''' + AFile.Name + ''' no found');
     112  if Assigned(App) then begin
     113    Scheduler.AddTask(App.Name, App.Run);
     114  end else raise Exception.Create('Application ''' + AFile.Name + ''' no found');
    57115end;
    58116
     
    62120  NewFile: TFile;
    63121begin
     122  Scheduler.Free;
     123  Scheduler := SchedulerClass.Create;
     124
    64125  NewDrive := TDrive.Create;
    65126  NewDrive.Name := 'System';
    66   NewDrive.FileSystem := TBaseFileSystem.Create;
     127  NewDrive.FileSystem := FileSystemClass.Create;
    67128  Drives.Add(NewDrive);
    68129
     
    83144    SystemFileSystem := SystemDrive.FileSystem;
    84145    AppFile := TFile(SystemFileSystem.TopDirectory.Items.FindByName('Clock'));
    85     if Assigned(AppFile) then Execute(AppFile)
     146    if Assigned(AppFile) then AppExecute(AppFile)
    86147      else raise Exception.Create('Cannot start first application');
     148    Scheduler.Start;
    87149  end else raise Exception.Create('Missing System drive');
    88150end;
     
    92154  Drives := TNamedObjectList.Create;
    93155  Apps := TNamedObjectList.Create;
     156  Scheduler := TScheduler.Create;
    94157end;
    95158
    96159destructor TKernel.Destroy;
    97160begin
     161  Scheduler.Free;
    98162  Apps.Free;
    99163  Drives.Free;
Note: See TracChangeset for help on using the changeset viewer.