Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Timer ohne Timer (https://www.delphipraxis.net/146235-timer-ohne-timer.html)

Luce 16. Jan 2010 10:17


Timer ohne Timer
 
Hallo Leute,
ich sitze grade an einem Spiel und komme leider ins Stocken. Das Game soll ein "Abklatsch" von "Dance Dance Revolution" sein (http://www.youtube.com/watch?v=vb6GN...9EC520&index=0)
Ich habe das Programm auch soweit fertig, jedoch als ich nun Lieder einbinden wollte, habe ich bemerkt, das die Durchläufe immer unterschiedlich schnell sind. Bzw. es auch ein unteschied macht ob ich die Pfeile treffe, oder nicht.
Ich bin mir ziemlich sicher das dies an den eingesetzten Timern liegt und meine Frage wäre jetzt wie ich die standart Timer umgehen kann?
Ich habe mich etwas zu "Timebasedmovement" belesen, wo ich via timegettime oder den QueryPerformanceCounter arbeite, habe aber nicht wirklich eine möglichkeit gefunden damit meinen timer zu umgehen.
Grundsätzlich habe ich einen Standarttimer welche sich jede milisekunde aufruft, die Pfeile bewegt und prüft ob zur richtigen Zeit die richtige Taste gedrückt wird oder nicht. Und einen zweiten welcher den String abklappert worin sich die Reihenfolge der Pfeile befindet. Die restlichen sind für das Problem erstmal unrelevant.
Ich bin mir sicher das mir jemand von euch helfen kann.
Vielen Dank

Luce

implementation 16. Jan 2010 10:43

Re: Timer ohne Timer
 
Welchen Timer hast du benutzt? Den aus der VCL?

Versuch mal, direkt den Windows-Timer zu benutzen. Das tut der VCL-Timer vermutlich auch nur, aber versuchen kostet nix.
Ansonsten bastel dir mit nem Zusatz-Thread und Sleep() nen eigenen Timer.

Delphi-Laie 16. Jan 2010 11:12

Re: Timer ohne Timer
 
In der Komponente "CoolTrayIcon" ist ein sog. "SimpleTimer" integriert, der sich auch separat verwenden läßt und weniger Systemressourcen als der VCL-Timer des Delphis beanspruchen soll.

Luce 16. Jan 2010 15:00

Re: Timer ohne Timer
 
ich versuche erstmal mein bestes mit der thread und sleep variante.
danke euch

busybyte 16. Jan 2010 17:37

Re: Timer ohne Timer
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TThreadTimer = class(TThread)       //Threadtimer Deklaration
   private
    aktuelleZeit,startZeit: int64;
    procedure Execute; override;  //Edit Execute und OnTimer als private
    procedure OnTimer;
   published
    constructor Create; virtual;
 end;

  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    ThreadTimer: TThreadTimer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TThreadTimer.Create;
begin
  inherited create(True);
  QueryPerformanceCounter(startZeit); //Startzeit ermitteln
  resume;
end;

procedure TThreadTimer.OnTimer;
Var T:integer;
Freq:int64;
begin
QueryPerformanceCounter(aktuelleZeit);
QueryPerformanceFrequency(Freq);
Freq:=Freq div 1000; //Um Millisekunden zu erhalten
T:=(aktuelleZeit-startZeit) div Freq;

if T>9999 then //Abbruch bei 10 Sekunden //Edit oder wahlweise eine andere Aktion durchführen
 Terminate;

Form1.Label1.Caption := IntToStr(T);
end;


procedure TThreadTimer.Execute;
begin
 while not Terminated do
   begin
   Synchronize(Self,OnTimer);
   end;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
//Noch ein alter ThreadTimer vorhanden,wenn ja dann Beenden und Speicher freigeben
if Assigned(ThreadTimer) then
 begin
 ThreadTimer.Terminate;
 FreeandNil(ThreadTimer);
 end;

ThreadTimer := TThreadTimer.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(ThreadTimer) then
 begin
 ThreadTimer.Terminate;
 FreeandNil(ThreadTimer);
 end;
end;

end.

Reinhard Kern 17. Jan 2010 09:41

Re: Timer ohne Timer
 
Zitat:

Zitat von Luce
..Grundsätzlich habe ich einen Standarttimer welche sich jede milisekunde aufruft, die Pfeile bewegt und prüft ob zur richtigen Zeit die richtige Taste gedrückt wird oder nicht. ...
Luce

Hallo,

damit fängt wahrscheinlich das Problem schon an. Windows schafft es oft garnicht, einen Timer alle ms aufzurufen. Es werden aber nicht Timer-Messages nacheinander in die Queue geschoben, sondern meines Wissens bleibt es auch bei Überlauf bei einer einzigen Timer-Message, und wenn dein Programm diese bedient, können folglich auch 2 oder 3 ms vergangen sein. Für einen Embedded-Microprozessor ist eine Zeitbasis von 1 ms angemessen, aber unter Windows ist alles unter 10 ms relativ unsicher.

Gruss Reinhard

Luce 17. Jan 2010 14:47

Re: Timer ohne Timer
 
Großes Danke an busybyte!
Meine Variante hat nicht immer das gemacht was ich wollte ;)

also ich habe jetzt in dem obigen quelltext "if t mod 1000=0 then begin[...]end" eingefügt, aber jetzt ist noch weniger rhytmus drin.
ich hab die label anzeige unten gelassen aber das programm reagiert nicht jede sekunde. woran kann das liegen?

busybyte 17. Jan 2010 15:45

Re: Timer ohne Timer
 
Schätze du musst anschliessend dann auch die System-Messages ausführen lassen, da die im thread nicht abgearbeitet werden
versuch mal

Delphi-Quellcode:
if t mod 1000=0 then
begin
...
Application.Processmessages;
end;

Luce 17. Jan 2010 16:03

Re: Timer ohne Timer
 
Nein, daran liegt es leider nicht. Es springt auch immer unterschiedlich...
Ist auch nicht so das er die Überprüfung nicht aufruft. Nur manchmal ändert er das Bild(in meinem Fall ein Bild) erst bei 1,5 sekunden und dann stolpern die anderen sehr schnell(zu schnell) nach.

busybyte 17. Jan 2010 16:14

Re: Timer ohne Timer
 
hm dann bräuchte man etwas von deinem quelltext,der aber vermutlich was grösseres ist, so kann ich das nicht nachvollziehen, kannst ihn mir evtl. als pn schicken
(und wenn dann noch unsere delphiversionen zusammenpassen)...

es gibt evtl. noch die möglichkeit mit
Delphi-Quellcode:
  try
   CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
 
  ...
  finally
  CoUninitialize;
  end;
zu arbeiten, aber ich denke irgendwie nicht das das der richtige weg ist, vielmehr scheint mir das eine andere routine in nen thread reingehört, die das system lahmlegt


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:48 Uhr.
Seite 1 von 2  1 2      

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