Advertisement
Guest User

Untitled

a guest
Aug 19th, 2020
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.99 KB | None | 0 0
  1. const
  2. APaused = 'Already paused';
  3. type
  4. TMarkedTime = record
  5. tag: string;
  6. time, startTime, __prevMark: UInt64;
  7. paused: Boolean;
  8. end;
  9.  
  10. TMarkedTimeArray = array of TMarkedTime;
  11. TMarkedTimeList = record
  12. FList: TMarkedTimeArray;
  13. end;
  14.  
  15. TTaggedTimeMarker = record
  16. FInfo: TMarkedTimeList;
  17. end;
  18.  
  19. procedure TMarkedTime.Init(aTag: string);
  20. begin
  21. Self.paused := False;
  22. Self.time := 0;
  23. Self.startTime := getTickCount64();
  24. Self.__prevMark := 0;
  25. Self.tag:= aTag;
  26. end;
  27.  
  28. procedure TMarkedTime.Reset();
  29. begin
  30. Self.paused := False;
  31. Self.time := 0;
  32. Self.startTime := getTickCount64();
  33. Self.__prevMark := 0;
  34. end;
  35.  
  36. procedure TMarkedTime.start();
  37. begin
  38. Self.__prevMark := getTickCount64();
  39. if (not Self.paused) then
  40. begin
  41. Self.startTime := getTickCount64();
  42. Self.time := 0;
  43. end;
  44. Self.paused := False;
  45. end;
  46.  
  47. procedure TMarkedTime.Pause;
  48. begin
  49. if not Self.paused then
  50. begin
  51. Self.time := Self.time + (getTickCount64() - Self.__prevMark);
  52. Self.paused := True;
  53. end else
  54. WriteLn(APaused);
  55. end;
  56.  
  57. function TMarkedTime.GetTime(): int64;
  58. begin
  59. if not Self.paused then
  60. Result := Self.time + (getTickCount64() - Self.__prevMark)
  61. else
  62. Result := Self.time;
  63. end;
  64.  
  65. function TMarkedTime.GetTotalTime(): int64;
  66. begin
  67. if (Self.startTime > 0) then
  68. Result := getTickCount64() - Self.startTime;
  69. end;
  70.  
  71. procedure TMarkedTimeList.Init;
  72. begin
  73. SetLEngth(FList, 0);
  74. end;
  75.  
  76. procedure TMarkedTimeList.Destroy;
  77. begin
  78. SetLEngth(FList, 0);
  79. end;
  80.  
  81. function TMarkedTimeList.GetCount: integer;
  82. begin
  83. result := Length(Flist);
  84. end;
  85.  
  86. function TMarkedTimeList.GetItem(Index: Integer): TMarkedTime;
  87. begin
  88. if (Index >= 0) and (Index < GetCount()) then
  89. Result := FList[Index];
  90. end;
  91.  
  92. procedure TMarkedTimeList.SetItem(Index: integer; aItem: TMarkedTime);
  93. begin
  94. if Index <=GetCount() then
  95. FList[Index] := aItem;
  96. end;
  97.  
  98. procedure TMarkedTimeList.Add(aItem: TMarkedTime);
  99. var
  100. len: integer;
  101. begin
  102. len := Length(FList);
  103. SetLength(FList, len + 1);
  104. FList[len] := aItem;
  105. end;
  106.  
  107. function TMarkedTimeList.Remove(const Idx: Integer; const Count: Integer): Integer;
  108. var
  109. I, J, L, M, F: Integer;
  110. begin
  111. L := Length(Flist);
  112. if (Idx >= L) or (Idx + Count <= 0) or (L = 0) or (Count = 0) then
  113. begin
  114. Result := 0;
  115. exit;
  116. end;
  117. I := Max(Idx, 0);
  118. J := Min(Count, L - I);
  119. M := L - J - I;
  120. for F := 0 to M - 1 do
  121. FList[I + F] := FList[I + J + F];
  122. SetLength(FList, L - J);
  123. Result := J;
  124. end;
  125.  
  126. function TMarkedTimeList.IndexOf(aTag: string): Integer;
  127. var
  128. I, len: Integer;
  129. begin
  130. len := GetCount();
  131. for I := 0 to len - 1 do
  132. if FList[i].Tag = aTag then
  133. begin
  134. Result := I;
  135. Exit;
  136. end;
  137. Result := - 1;
  138. end;
  139. (*
  140. TTaggedTimeMarker.Init
  141. ~~~~~~~~~~~~~~~~~
  142.  
  143. .. code-block pascal
  144.  
  145. procedure TTaggedTimeMarker.Init;
  146.  
  147. Constuctor TTaggedTimeMarker object.
  148.  
  149. .. note::
  150.  
  151. - by Cynic
  152.  
  153. Example:
  154.  
  155. .. code-block:: pascal
  156.  
  157. MyTaggedTimeMarker.Init;
  158. *)
  159. procedure TTaggedTimeMarker.Init;
  160. begin
  161. FInfo.Init;
  162. end;
  163. (*
  164. TTaggedTimeMarker.Init
  165. ~~~~~~~~~~~~~~~~~
  166.  
  167. .. code-block pascal
  168.  
  169. procedure TTaggedTimeMarker.Destroy;
  170.  
  171. Destructor TTaggedTimeMarker object.
  172.  
  173. .. note::
  174.  
  175. - by Cynic
  176.  
  177. Example:
  178.  
  179. .. code-block:: pascal
  180.  
  181. MyTaggedTimeMarker.Destroy;
  182. *)
  183. procedure TTaggedTimeMarker.Destroy;
  184. begin
  185. FInfo.Destroy;
  186. end;
  187. (*
  188. TTaggedTimeMarker.Start
  189. ~~~~~~~~~~~~~~~~~
  190.  
  191. .. code-block pascal
  192.  
  193. procedure TTaggedTimeMarker.start(Tag: string);
  194.  
  195. Create and starts the timer with tag as timer name. Can also be used when paused to continue where it left.
  196.  
  197. .. note::
  198.  
  199. - by Bart de Boer, Cynic
  200.  
  201. Example:
  202.  
  203. .. code-block:: pascal
  204.  
  205. MyTaggedTimeMarker.start('My first timer');
  206. *)
  207. procedure TTaggedTimeMarker.Start(Tag: string);
  208. var
  209. MarkedTime: TMarkedTime;
  210. ElemIndex: integer;
  211. begin
  212. ElemIndex := FInfo.IndexOf(Tag);
  213. if (ElemIndex > - 1) then
  214. begin
  215. MarkedTime := FInfo.GetItem(ElemIndex);
  216. MarkedTime.Start();
  217. FInfo.SetItem(ElemIndex,MarkedTime);
  218. end
  219. else
  220. begin
  221. MarkedTime.Init(Tag);
  222. MarkedTime.Start();
  223. FInfo.Add(MarkedTime);
  224. end;
  225. end;
  226.  
  227. (*
  228. TTaggedTimeMarker.RemoveTimer
  229. ~~~~~~~~~~~~~~~~~
  230.  
  231. .. code-block pascal
  232.  
  233. procedure TTaggedTimeMarker.RemoveTimer(tag: string);
  234.  
  235. Remove the timer by tag..
  236.  
  237. .. note::
  238.  
  239. - by Bart de Boer, Cynic
  240.  
  241. Example:
  242.  
  243. .. code-block:: pascal
  244.  
  245. MyTaggedTimeMarker.RemoveTimer('My first timer');
  246. *)
  247. procedure TTaggedTimeMarker.RemoveTimer(Tag: string);
  248. var
  249. MarkedTime: TMarkedTime;
  250. ElemIndex: integer;
  251. begin
  252. ElemIndex := FInfo.IndexOf(Tag);
  253. if (ElemIndex > - 1) then
  254. FInfo.Remove(ElemIndex,1) else
  255. begin
  256. WriteLn(Format('Item with tag = %s not found!', [tag]));
  257. TerminateScript;
  258. end;
  259. end;
  260.  
  261. (*
  262. TTaggedTimeMarker.GetTotalTime
  263. ~~~~~~~~~~~~~~~~~~~~~~~~
  264.  
  265. .. code-block pascal
  266.  
  267. function TTaggedTimeMarker.GetTotalTime(Tag: string): int64;
  268.  
  269. Gets the time from the timer by tag including the time it was paused.
  270.  
  271. .. note::
  272.  
  273. - by Bart de Boer, Cynic
  274.  
  275. Example:
  276.  
  277. .. code-block:: pascal
  278.  
  279. BreakTime := MyTaggedTimeMarker.getTotalTime('My first timer') - MyTaggedTimeMarker.getTime('My first timer');
  280.  
  281. *)
  282. function TTaggedTimeMarker.GetTotalTime(Tag: string): int64;
  283. var
  284. MarkedTime: TMarkedTime;
  285. ElemIndex: integer;
  286. begin
  287. result:=-1;
  288. ElemIndex := FInfo.IndexOf(Tag);
  289. if (ElemIndex > - 1) then
  290. begin
  291. MarkedTime := FInfo.GetItem(ElemIndex);
  292. result:=MarkedTime.GetTotalTime;
  293. end
  294. else
  295. begin
  296. WriteLn(Format('Item with tag = %s not found!', [tag]));
  297. TerminateScript;
  298. end;
  299. end;
  300. (*
  301. TTaggedTimeMarker.Pause
  302. ~~~~~~~~~~~~~~~~~
  303.  
  304. .. code-block pascal
  305.  
  306. procedure TTaggedTimeMarker.pause(tag: string);
  307.  
  308. Pauses the timer by tag. It can be continued with start(tag).
  309.  
  310. .. note::
  311.  
  312. - by Bart de Boer, Cynic
  313.  
  314. Example:
  315.  
  316. .. code-block:: pascal
  317.  
  318. MyTaggedTimeMarker.pause('My first timer');
  319. TakeABreak(90000);
  320. MyTaggedTimeMarker.start('My first timer');
  321. *)
  322. procedure TTaggedTimeMarker.Pause(Tag: string);
  323. var
  324. MarkedTime: TMarkedTime;
  325. ElemIndex: integer;
  326. begin
  327. ElemIndex := FInfo.IndexOf(Tag);
  328. if (ElemIndex > - 1) then
  329. begin
  330. MarkedTime := FInfo.GetItem(ElemIndex);
  331. MarkedTime.Pause;
  332. FInfo.SetItem(ElemIndex,MarkedTime);
  333. end
  334. else
  335. begin
  336. WriteLn(Format('Item with tag = %s not found!', [tag]));
  337. TerminateScript;
  338. end;
  339. end;
  340. (*
  341. TTaggedTimeMarker.Reset
  342. ~~~~~~~~~~~~~~~~~
  343.  
  344. .. code-block pascal
  345.  
  346. procedure TTaggedTimeMarker.reset(Tag: string);
  347.  
  348. Stops the timer and resets it to zero by tag.
  349.  
  350. .. note::
  351.  
  352. - by Bart de Boer, Cynic
  353.  
  354. Example:
  355.  
  356. .. code-block:: pascal
  357.  
  358. MyTaggedTimeMarker.Reset('My first timer');
  359. *)
  360. procedure TTaggedTimeMarker.Reset(Tag: string);
  361. var
  362. MarkedTime: TMarkedTime;
  363. ElemIndex: integer;
  364. begin
  365. ElemIndex := FInfo.IndexOf(Tag);
  366. if (ElemIndex > - 1) then
  367. begin
  368. MarkedTime := FInfo.GetItem(ElemIndex);
  369. MarkedTime.Reset;
  370. FInfo.SetItem(ElemIndex,MarkedTime);
  371. end
  372. else
  373. begin
  374. WriteLn(Format('Item with tag = %s not found!', [tag]));
  375. TerminateScript;
  376. end;
  377. end;
  378. (*
  379. TTaggedTimeMarker.GetTime
  380. ~~~~~~~~~~~~~~~~~~~
  381.  
  382. .. code-block pascal
  383.  
  384. function TTaggedTimeMarker.GetTime(): int64;
  385.  
  386. Gets the time from the timer. Returns zero if the timer was not set.
  387.  
  388. .. note::
  389.  
  390. - by by Bart de Boer, Cynic
  391.  
  392. Example:
  393.  
  394. .. code-block:: pascal
  395.  
  396. MyTaggedTimeMarker.start('My first timer');
  397. repeat
  398. DoStuff;
  399. until(MyTaggedTimeMarker.GetTime('My first timer') > 60000);
  400.  
  401. *)
  402. function TTaggedTimeMarker.GetTime(Tag: string): int64;
  403. var
  404. MarkedTime: TMarkedTime;
  405. ElemIndex: integer;
  406. begin
  407. result:=-1;
  408. ElemIndex := FInfo.IndexOf(Tag);
  409. if (ElemIndex > - 1) then
  410. begin
  411. MarkedTime := FInfo.GetItem(ElemIndex);
  412. result:=MarkedTime.GetTime;
  413. end
  414. else
  415. begin
  416. WriteLn(Format('Item with tag = %s not found!', [tag]));
  417. TerminateScript;
  418. end;
  419. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement