AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Timer ohne Timer

Ein Thema von Luce · begonnen am 16. Jan 2010 · letzter Beitrag vom 17. Jan 2010
Antwort Antwort
Seite 1 von 2  1 2      
Luce

Registriert seit: 16. Jan 2010
8 Beiträge
 
#1

Timer ohne Timer

  Alt 16. Jan 2010, 11:17
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
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Timer ohne Timer

  Alt 16. Jan 2010, 11:43
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.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

Re: Timer ohne Timer

  Alt 16. Jan 2010, 12:12
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.
  Mit Zitat antworten Zitat
Luce

Registriert seit: 16. Jan 2010
8 Beiträge
 
#4

Re: Timer ohne Timer

  Alt 16. Jan 2010, 16:00
ich versuche erstmal mein bestes mit der thread und sleep variante.
danke euch
  Mit Zitat antworten Zitat
busybyte

Registriert seit: 15. Sep 2006
165 Beiträge
 
#5

Re: Timer ohne Timer

  Alt 16. Jan 2010, 18:37
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.
I love DiscCat
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#6

Re: Timer ohne Timer

  Alt 17. Jan 2010, 10:41
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
  Mit Zitat antworten Zitat
Luce

Registriert seit: 16. Jan 2010
8 Beiträge
 
#7

Re: Timer ohne Timer

  Alt 17. Jan 2010, 15:47
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?
  Mit Zitat antworten Zitat
busybyte

Registriert seit: 15. Sep 2006
165 Beiträge
 
#8

Re: Timer ohne Timer

  Alt 17. Jan 2010, 16:45
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;
I love DiscCat
  Mit Zitat antworten Zitat
Luce

Registriert seit: 16. Jan 2010
8 Beiträge
 
#9

Re: Timer ohne Timer

  Alt 17. Jan 2010, 17:03
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.
  Mit Zitat antworten Zitat
busybyte

Registriert seit: 15. Sep 2006
165 Beiträge
 
#10

Re: Timer ohne Timer

  Alt 17. Jan 2010, 17:14
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
I love DiscCat
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:22 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