Hallo, ich habe ein Problem mit einem Timer.
In der Prozedur, die mit dem OnTimer-Ereignis verknüpft ist, steht ziemlich viel. Ich habe immer mehr reingeschrieben und irgendwann haben folgende Dinge nicht mehr funktioniert:
- Ich kann den Interval nicht mehr festlegen. Die Prozedur wird jetzt immer schnellstmöglich in Dauerschleife ausgeführt.
- "enabled:=false" funktioniert nicht mehr.
- "close;" funktioniert nicht mehr. Das Programm lässt ich nur noch durch den Task-manager bzw. Durch die "Halt"-Funktion in Lazarus beenden.
Wo sollte ich am ehesten anfangen nach dem Fehler zu suchen? Mein Eindruck ist, dass alles, was den Timer direkt betrifft, richtig ist, er aber mit irgendetwas in der Prozedur nicht richtig umgehen kann und dadurch nicht mehr reagiert.
TTimer reagiert nicht mehr
-
- Beiträge: 6167
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: TTimer reagiert nicht mehr
Vielleicht machst du im Timer zuviel, das die Zeit des Intervall nicht mehr ausreicht.
Den Intervall am Anfang schon etwas höher stellen.
Dieses Befehl am richtigen Ort, könnte evtl. aushelfen, vor allem wen irgendwas in deiner Anwendung alles blockiert.
Den Intervall am Anfang schon etwas höher stellen.
Dieses Befehl am richtigen Ort, könnte evtl. aushelfen, vor allem wen irgendwas in deiner Anwendung alles blockiert.
Code: Alles auswählen
Application.ProcessMessages;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2636
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: TTimer reagiert nicht mehr
Zeig doch mal wie der Inhalt deines OnTimer aussieht.
Wenn es wirklich sehr viel ist, was du hier durchführst, dann kann sich der Timer auch mal mal selbst überholen. Schaltest du den Timer am Anfang von OnTimer ab und zum Schluss wieder an?
Wenn es wirklich sehr viel ist, was du hier durchführst, dann kann sich der Timer auch mal mal selbst überholen. Schaltest du den Timer am Anfang von OnTimer ab und zum Schluss wieder an?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: TTimer reagiert nicht mehr
Probier doch einfach mal den TTimer durch einen TIdleTimer zu ersetzen.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 730
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: TTimer reagiert nicht mehr
Ich hab grad mal was probiert:
TTimer auf 10ms Interrvall gesetzt und in der Timerfunktion extra langen (langsamen) Code geschrieben.
Rekursiv wird der TTimer anscheinend nie aufgerufen,
er klaut jetzt nur die Rechenzeit, bei mir 50 Prozent CPU Leistung laut Taskmanager.
Das Programm an sich funktioniert aber trotzdem, auch wenn er nur so ca. jede Sekunde hochzählt, obwohl er das 100 mal pro Sekunde machen müste.
Verhält sich also meiner Meinung nach völlig einwandfrei.
TTimer auf 10ms Interrvall gesetzt und in der Timerfunktion extra langen (langsamen) Code geschrieben.
Rekursiv wird der TTimer anscheinend nie aufgerufen,
er klaut jetzt nur die Rechenzeit, bei mir 50 Prozent CPU Leistung laut Taskmanager.
Das Programm an sich funktioniert aber trotzdem, auch wenn er nur so ca. jede Sekunde hochzählt, obwohl er das 100 mal pro Sekunde machen müste.
Verhält sich also meiner Meinung nach völlig einwandfrei.
Code: Alles auswählen
var cnt:Integer;
var f:Boolean;
procedure TForm1.Timer1Timer(Sender: TObject);
var x:Double; i:Integer;
begin
if f then begin
form1.caption:='Rekursiv';
exit;
end;
f:=TRUE;
form1.caption:=IntToStr(cnt);
inc(cnt);
for i:=0 to 10000000 do begin
x:=sin(i);
end;
F:=False;
end;
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 730
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: TTimer reagiert nicht mehr
Wenn es ein Windows Programm ist, kannst Du die Laufzeit recht präzise messen,
hier mal ein Beispiel:
hier mal ein Beispiel:
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
Windows; // Die Unit Windows wird unbedingt benötigt
type
{ TForm1 }
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
var freq,tStart,tStop:Int64;
var t:Single;
procedure TForm1.Timer1Timer(Sender: TObject);
var x:Double; i:Integer;
begin
QueryPerformanceFrequency(freq);
// ab hier soll die Zeit gemessen werden
QueryPerformanceCounter(tStart);
// hier kommt dein ganzer Code rein:
for i:=0 to 10000000 do begin
x:=sin(i);
end;
// hier ist das Ende der Zeitmessung
QueryPerformanceCounter(tStop);
// Berechnung der Zeit in Sekunden:
t:=(tStop-tStart) / freq; { in Sekunden umrechnen }
Form1.caption:=FloatToStr(t);
end;
end.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...