unit Unit2; {$mode ObjFPC}{$H+} interface uses Classes, SysUtils; const StartMSecsPerFrame = 20; type IGameHandler = class(TObject) private MSecsPerFrame: Integer; public Finished: Boolean; constructor Create; procedure DoIteration; virtual; abstract; procedure SlowDown; procedure SpeedUp; end; TActionThread = class(TThread) private FGameHandler: IGameHandler; public constructor Create(AGameHandler: IGameHandler); destructor Destroy; property GameHandler: IGameHandler read FGameHandler; procedure Execute; override; end; implementation constructor IGameHandler.Create; begin Finished := false; MSecsPerFrame := StartMSecsPerFrame end; procedure IGameHandler.SlowDown; begin MSecsPerFrame := StartMSecsPerFrame end; procedure IGameHandler.SpeedUp; begin MSecsPerFrame := 100 end; constructor TActionThread.Create(AGameHandler: IGameHandler); begin inherited Create(false); FGameHandler := AGameHandler end; destructor TActionThread.Destroy; begin FreeAndNil(FGameHandler) end; procedure TActionThread.Execute; var OldTime: TDateTime; ToWait: Integer; begin while not GameHandler.Finished do begin OldTime := Now; Synchronize(@FGameHandler.DoIteration); { Синхронизация с таймером. } ToWait := Round(GameHandler.MSecsPerFrame - (Now - OldTime) * MSecsPerDay); if ToWait > 0 then Sleep(ToWait) end end; end.