TTimer reagiert nicht mehr

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

TTimer reagiert nicht mehr

Beitrag von 400kmh »

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.

Mathias
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

Beitrag von Mathias »

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.

Code: Alles auswählen

  Application.ProcessMessages;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
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

Beitrag von m.fuchs »

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?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TTimer reagiert nicht mehr

Beitrag von Michl »

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; 

siro
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

Beitrag von siro »

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.

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...

siro
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

Beitrag von siro »

Wenn es ein Windows Programm ist, kannst Du die Laufzeit recht präzise messen,
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...

Antworten