AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Open-Source-Alternative zum VCL-Timer
Thema durchsuchen
Ansicht
Themen-Optionen

Open-Source-Alternative zum VCL-Timer

Ein Thema von Cöster · begonnen am 12. Dez 2006 · letzter Beitrag vom 13. Dez 2006
Antwort Antwort
Cöster
Registriert seit: 6. Jun 2006
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.
Angehängte Dateien
Dateityp: rar timer_625.rar (634 Bytes, 26x aufgerufen)
 
Balu der Bär
 
#2
  Alt 12. Dez 2006, 20:43
Hallo Christian,

entschuldige bitte aber ich stehe gerade etwas auf dem Schlauch, bei einem Standard TTimer kann ich durchaus ein Interval von 1 angeben...
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#3
  Alt 12. Dez 2006, 20:45
Angeben kannst du ein solch kurzes intervall schon, es wird aber vom Standard-Timer nicht so aufgelöst.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
 
#4
  Alt 12. Dez 2006, 21:20
Ich hab da ein kleines Problem mit der Anwendung des Timers
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
Mike
  Mit Zitat antworten Zitat
Robert Marquardt
 
#5
  Alt 13. Dez 2006, 05:33
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.
  Mit Zitat antworten Zitat
Cöster

 
Turbo Delphi für Win32
 
#6
  Alt 13. Dez 2006, 17:11
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 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. Der Code ist jetzt auch raus.

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.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins
 
#7
  Alt 13. Dez 2006, 17:28
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)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz