![]() |
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 ( ![]() 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 |
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. |
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.
|
Re: Timer ohne Timer
ich versuche erstmal mein bestes mit der thread und sleep variante.
danke euch |
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. |
Re: Timer ohne Timer
Zitat:
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 |
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? |
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; |
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. |
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:
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
try
CoInitializeEx(nil, COINIT_APARTMENTTHREADED); ... finally CoUninitialize; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 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 by Thomas Breitkreuz