TTimer reagiert nicht mehr

Für Fragen von Einsteigern und Programmieranfängern...

TTimer reagiert nicht mehr

Beitragvon 400kmh » 20. Dez 2017, 11:02 TTimer reagiert nicht mehr

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.
400kmh
 
Beiträge: 74
Registriert: 25. Mär 2010, 04:03

Beitragvon Mathias » 20. Dez 2017, 17:24 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.
Code: Alles auswählen
  Application.ProcessMessages;
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4262
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon m.fuchs » 20. Dez 2017, 17:30 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?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
 
Beiträge: 1963
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Michl » 20. Dez 2017, 22:10 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; 
Michl
 
Beiträge: 2260
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon siro » 21. Dez 2017, 15:22 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.

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: 305
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon siro » 21. Dez 2017, 15:31 Re: TTimer reagiert nicht mehr

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...
siro
 
Beiträge: 305
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

cron
porpoises-institution
accuracy-worried