Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Open-Source-Alternative zum VCL-Timer (https://www.delphipraxis.net/82416-open-source-alternative-zum-vcl-timer.html)

Cöster 12. Dez 2006 20:26


Open-Source-Alternative zum VCL-Timer
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi!

Die Tatsache, dass man mit dem VCL-Timer nicht auf Intervalle im Bereich von 1 ms kommt hat mich veranlasst, selbst einen kleinen Timer zu schreiben. Ich habe nämlich gemerkt, dass das Ruckeln, was mit dem VCL-Timer immer entstand an den hohen Intervallen lag (Man sagt zwar, man kann eh nur 50 Bilder pro Sekunde wahrnehmen, aber bei mir hat's trotzdem immer geruckelt). Mit diesem Timer lässt sich ein Intervall von 1 einstellen, wodurch man in Spielen die Bewegung in Pixel pro Timeraufruf auch runterschrauben kann.
Die CPU-Auslastung liegt bei rund 0%.

Es handelt sich nicht um eine Komponente, sondern um eine Klasse. Man erstellt einfach eine Instanz dieser Klasse und kann dann auf die vom VCL-Timer gewohnten Elemente Enabled, Interval und OnTimer zugreifen.

Ich würde mich über jede Art von Kritik sehr freuen.

Balu der Bär 12. Dez 2006 20:43

Re: Open-Source-Alternative zum VCL-Timer
 
Hallo Christian,

entschuldige bitte aber ich stehe gerade etwas auf dem Schlauch, bei einem Standard TTimer kann ich durchaus ein Interval von 1 angeben... :gruebel:

mkinzler 12. Dez 2006 20:45

Re: Open-Source-Alternative zum VCL-Timer
 
Angeben kannst du ein solch kurzes intervall schon, es wird aber vom Standard-Timer nicht so aufgelöst.

JasonDX 12. Dez 2006 21:20

Re: Open-Source-Alternative zum VCL-Timer
 
Ich hab da ein kleines Problem mit der Anwendung des Timers :gruebel:
Also als Ersatz zum TTimer der VCL kann ich den nicht nehmen. Aufgrund der Idee dahinter, um genauer zu sein aufgrund Dieser Methode:
Delphi-Quellcode:
procedure TCoesterTimer.Run;
var
   NextTimerTime: Cardinal;
begin
   NextTimerTime := TimeGetTime + FInterval;
   while True do
   begin
      repeat
         Application.ProcessMessages;
         if Application.Terminated then
            Exit;
         Sleep(1);
      until NextTimerTime <= TimeGetTime;
      FOnTimer;
      Inc(NextTimerTime, FInterval);
   end;
end;
Am Ende siehts dann so aus, dass eine Funktion, die den Timer enabled, nicht zu Ende gefuehrt wird, bis die Applikation terminiert:
Delphi-Quellcode:
procedure TCoesterTimer.SetEnabled(Value: Boolean);
var
   OldInterval: Byte;
   OldOnTimer: TProcedure;
begin
//[...]
      if Value then
      begin
         FEnabled := Value;
         Run;
      end
//[...]
:?
Zudem:
Delphi-Quellcode:
Self.Destroy;
Self := TCoesterTimer.Create;
Sowas ist schon ziemlich .... :?
Wenn du einen wirklichen Timer programmieren willst, helfen dir vllt. die MSDN-Library durchsuchenTimer Event Operations weiter ;)

greetz
Mike

Robert Marquardt 13. Dez 2006 05:33

Re: Open-Source-Alternative zum VCL-Timer
 
Das der Timer unterhalb von ca. 16 ms versagt, ist eine Windows-Limitation.
Es gibt da aber Multimediatimer, die besser aufloesen. Die JVCL enthaelt einen solchen.

Cöster 13. Dez 2006 17:11

Re: Open-Source-Alternative zum VCL-Timer
 
Zitat:

Zitat von JasonDX
Am Ende siehts dann so aus, dass eine Funktion, die den Timer enabled, nicht zu Ende gefuehrt wird, bis die Applikation terminiert:

Hm, hast Recht. Wenn man den Timer enabled, sollte das erst am Ende einer Prozedur geschehen. Weitere Abbruchbedingung ist jetzt, dass der Timer not FEnabled ist.

Zitat:

Zitat von JasonDX
Delphi-Quellcode:
Self.Destroy;
Self := TCoesterTimer.Create;
Sowas ist schon ziemlich .... :?

Joa, ich hatte erst gedacht, dadurch könnte ich Run abbrechen. Aber das geht so anscheinend doch nicht. Deswegen hatte ich bei Run auch erst nicht not FEnabled als Abbruchbedingung, weil ich es für unnötig hielt. Nächste mal werd ich vorher lieber besser testen. :oops: Der Code ist jetzt auch raus.

Zitat:

Zitat von JasonDX
Wenn du einen wirklichen Timer programmieren willst, helfen dir vllt. die MSDN-Library durchsuchenTimer Event Operations weiter ;)

Joa, danke, werd mich mal informieren.

jfheins 13. Dez 2006 17:28

Re: Open-Source-Alternative zum VCL-Timer
 
Nur mal so:

Normale Spiele laufen nicht mit nem Timer, sondern in der Message-Loop, sodass also immer wenn keine anderen Messages da sind, ständig gezeichnet werden kann (while true do Paint;) und wenn Messages da sind (PeekMessage) wird diese Schleife unterbrochen,und nichts mehr gezeichnet. (Bspw. eine Close-Message)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz