Changeset 6 for trunk/UKernel.pas


Ignore:
Timestamp:
Nov 23, 2014, 11:17:11 PM (9 years ago)
Author:
chronos
Message:
  • Added: Preparation for support for IPC messaging.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UKernel.pas

    r5 r6  
    1010type
    1111  TTask = class;
     12  TScheduler = class;
    1213
    1314  TTaskEvent = procedure(Task: TTask) of object;
    1415
    15   TTaskState = (tsStopped, tsRunning, tsSuspended);
     16  TTaskState = (tsStopped, tsRunning, tsSuspended, tsWaiting);
     17
     18  TIPCMessage = class
     19    Name: string;
     20    Action: string;
     21
     22  end;
     23
     24  TWaitReason = (wrSleep, wrMessage);
    1625
    1726  { TTask }
    1827
    1928  TTask = class(TNamedObject)
    20     Name: string;
     29    Scheduler: TScheduler;
    2130    State: TTaskState;
     31    WaitReason: TWaitReason;
     32    WakeUpTime: TDateTime;
    2233    Terminated: Boolean;
    2334    EntryPoint: TTaskEvent;
     35    Messages: TObjectQueue; // TQueue<TIPMessage>
     36    procedure WaitForMessage;
     37    procedure Sleep(Duration: TDateTime);
    2438    constructor Create; virtual;
     39    destructor Destroy; override;
    2540  end;
    2641
     
    3348    Tasks: TNamedObjectList; // TList<TTask>
    3449    Running: Boolean;
     50    function GetCurrentTask: TTask; virtual;
    3551    procedure Start; virtual;
    3652    procedure Stop; virtual;
    3753    function AddTask(Name: string; EntryPoint: TTaskEvent): TTask; virtual;
     54    procedure SwitchNext; virtual;
    3855    constructor Create; virtual;
    3956    destructor Destroy; override;
     
    5673    constructor Create; virtual;
    5774    procedure Service(Index: Integer; DataIn, DataOut: TMemory); virtual;
     75  end;
     76
     77  TTimer = class
     78    Period: TDateTime;
     79  end;
     80
     81  TScreen = class
     82    Size: TPoint;
     83    DPI: Integer;
    5884  end;
    5985
     
    6793    FileSystemClass: TFileSystemClass;
    6894    Devices: TNamedObjectList; // TList<TDevice>
     95    Screens: TObjectList; // TList<TScreen>
    6996    procedure AppExecute(AFile: TFile);
    7097    procedure Init;
     
    106133{ TTask }
    107134
     135procedure TTask.WaitForMessage;
     136begin
     137  WaitReason := wrMessage;
     138  State := tsWaiting;
     139  Scheduler.SwitchNext;
     140end;
     141
     142procedure TTask.Sleep(Duration: TDateTime);
     143begin
     144  WakeUpTime := Now + Duration;
     145  State := tsWaiting;
     146  WaitReason := wrSleep;
     147  Scheduler.SwitchNext;
     148end;
     149
    108150constructor TTask.Create;
    109151begin
    110 
     152  Messages := TObjectQueue.Create;
     153end;
     154
     155destructor TTask.Destroy;
     156begin
     157  Messages.Free;
     158  inherited Destroy;
    111159end;
    112160
    113161{ TScheduler }
    114162
     163function TScheduler.GetCurrentTask: TTask;
     164begin
     165  Result := nil;
     166end;
     167
    115168procedure TScheduler.Start;
    116169begin
     
    128181begin
    129182  NewTask := TaskClass.Create;
     183  NewTask.Scheduler := Self;
    130184  NewTask.Name := Name;
    131185  NewTask.EntryPoint := EntryPoint;
    132186  Tasks.Add(NewTask);
    133187  Result := NewTask;
     188end;
     189
     190procedure TScheduler.SwitchNext;
     191begin
     192
    134193end;
    135194
     
    201260  Apps := TNamedObjectList.Create;
    202261  Scheduler := TScheduler.Create;
     262  Screens := TObjectList.Create;
    203263end;
    204264
    205265destructor TKernel.Destroy;
    206266begin
     267  Screens.Free;
    207268  Scheduler.Free;
    208269  Apps.Free;
Note: See TracChangeset for help on using the changeset viewer.