![]() |
Timer Reset ?
habe folgendes vor in meinem Programm:
Wenn nichts im Programm gemacht wird, z.b. die Maus für 1 Stunde nicht bewegt wird, soll das Programm sich beenden. Eigentlich wäre da so eine art RESET für den timer angebracht, den ich bei application.mousemove einbauen würde. So dass der Timer immer auf 0 gestellt wird wenn die maus bewegt wird. Aber dieses RESET gibt es leider nicht, daher meine Frage: wie kann ich dies realiseren? und ist es für das Programm nicht zuviel "arbeit" wenn bei JEDER mausbewegung ein Timer Resettet wird?? |
Re: Timer Reset ?
Delphi-Quellcode:
Voila, er fängt von vorne an ;)
Timer1.Enabled:=false;
Timer1.Enabled:=true; (:party: 1000. Beitrag :party:) |
Re: Timer Reset ?
klingt logisch :)
Bleibt noch die 2. Frage offen: Ist es für das Programm nicht zuviel "arbeit", wenn bei jeder Mausbewegung der Timer zurückgesetzt wird? Weil die maus ja normalerweise ständig bewegt wird, was bedeutet das Programm müßte jede sekunde mehrmals den timer zurücksetzen. |
Re: Timer Reset ?
Hallo,
wozu den Timer? In der OnIdle-Routine der Application kann GetLastInputInfo() verwendet werden um den Zeitpunkt des letzten InputEvents abzufragen. Grüße vom marabu |
Re: Timer Reset ?
GetLastInputInfo gibt doch systemweit den Zeitpunkt des letzten InputEvents zurück, oder?
Es soll aber nur der inputevent von meinem Programm beachtet werden, denn an dem pc wird weitergearbeitet, aber nicht in meinem programm. |
Re: Timer Reset ?
Guten Morgen,
etwa so habe ich mir das vorgestellt:
Delphi-Quellcode:
Getippt und nicht getestet.
type
TDemoForm = class(TForm) ApplicationEvents: TApplicationEvents; procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean); procedure ApplicationEventsActivate(Sender: TObject); private LastInput: Cardinal; end; { ... } const MAX_APPIDLE_TICKS = 5000; procedure TDemoForm.ApplicationEventsActivate(Sender: TObject); begin LastInput := GetTickCount; end; procedure TDemoForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean); var lii: TLastInputInfo; begin if Application.Active then begin lii.cbSize := SizeOf(TLastInputInfo); GetLastInputInfo(lii); LastInput := lii.dwTime; end; // show idle tickcount Caption := IntToStr(GetTickCount - LastInput); Invalidate; if LastInput + MAX_APPIDLE_TICKS < GetTickCount then Close else Done := True; end; Freundliche Grüße |
AW: Re: Timer Reset ?
Zitat:
|
AW: Re: Timer Reset ?
XE4: TTimer in VCL?
Das setzt auf ![]() und die TTimer-Komponente löscht den kompletten Timer, jedes mal, wenn man die Einstellungen ändert und erstellt ihn danach eventuell neu. (Interval oder Enabled) Somit sollte das Intervall also eigentlich von vorne loszählen. Windows ändert an dem Verhalten nichts und bei Embarcadero ändert sich eh nie was. Aber wenn, dann sollte es nicht an Delphi, sondern an Windows liegen, aber die werden da hoffentlich nichts ändern. Wenn es aber um FMX geht ... tja, wer weiß was da intern vom TTimer verwendet wird. |
AW: Timer Reset ?
Ja genau, TTimer in VCL. Das ist ganz merkwürdig. Hab ich so auch noch nie erlebt. Zur Reproduktion des Fehlers habe ich ein ganz einfaches Testprogramm gebastelt:
Delphi-Quellcode:
Die dreifache Wertänderung habe ich gemacht um sicher zu gehen, dass in jedem Fall eine Wertänderung eintritt, egal wie Timer1.Enabled im Moment des Buttonclicks besetzt ist. Das Intervall lasse ich auf den standardmäßigen 1000 ms.
unit Unit5;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } FCounter: Integer; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin FCounter:= 0; end; procedure TForm1.Button1Click(Sender: TObject); begin Inc(FCounter); Timer1.Enabled:= TRUE; Timer1.Enabled:= FALSE; Timer1.Enabled:= TRUE; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Caption:= IntToStr(FCounter); Timer1.Enabled:= FALSE; end; end. Normalerweise müsste sich die Zahl im Fenstercaption immer exakt 1 Sekunde nach dem Buttonclick um 1 erhöhen. Tatsächlich aber scheint es ein Zufallswert zwischen 0 und 1000 ms zu sein. Jetzt hatte ich auch zuerst Windows im Verdacht. Also virtuelle Maschine geöffnet, da ist ein Win 10 drauf (Host = Win 7). Gleicher Effekt. Jetzt kommts aber: Gehe ich mit der selben EXE auf einen anderen physischen Rechner, läuft es ganz normal. Jetzt würde mich mal interessieren, wie Windows den Timer bzw. GetTickCount realisiert. Soweit ich weiß sollte das doch ein mehr oder weniger "geeichtes" Signal aus einem Quarz auf dem Mainboard sein, oder? Wenn der einen an der Marmelade hätte, müsste doch auch die Systemzeit aus dem Ruder laufen, und zwar auffallend stark. Die aber scheint keine Probleme zu haben. Selbst dann nicht, wenn ich ein Live-Linux von DVD starte. |
AW: Timer Reset ?
Hallo,
Zitat:
Ein Windows-Standard-Timer ist sehr ungenau. Eine Timer-Nachricht hat zusammen mit WM_PAINT eine geringere Priorität als andere Nachrichten. Windows ist von Haus aus kein Echtzeit-Betriebssytem. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:39 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