aboutsummaryrefslogtreecommitdiff
path: root/Занимательное программирование/7/7_columns/unit2.pas
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-04-20 14:55:53 +0200
committerEugen Wissner <belka@caraus.de>2026-04-20 14:55:53 +0200
commitee8f910cb0a2761d77a13fb4423a157a6d64b19c (patch)
tree7b6a8ce7c0fc356ffeaec09423907ce46364a592 /Занимательное программирование/7/7_columns/unit2.pas
parent8987b96aeb0937290320e6d9ed2e18ff706f3723 (diff)
downloadbook-exercises-ee8f910cb0a2761d77a13fb4423a157a6d64b19c.tar.gz
Закончил Columns из 7-й главы, седьмого упражнения
Diffstat (limited to 'Занимательное программирование/7/7_columns/unit2.pas')
-rw-r--r--Занимательное программирование/7/7_columns/unit2.pas86
1 files changed, 86 insertions, 0 deletions
diff --git a/Занимательное программирование/7/7_columns/unit2.pas b/Занимательное программирование/7/7_columns/unit2.pas
new file mode 100644
index 0000000..d4f6f4f
--- /dev/null
+++ b/Занимательное программирование/7/7_columns/unit2.pas
@@ -0,0 +1,86 @@
+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.
+