![]() |
Probleme mit Timer
Hallo zusammen,
ich bräuchte mal etwas Schützenhilfe bei einem Problem. Ich habe ein Tool mit einem optional aktivierbaren Timer. Dieser Timer dient als Zeitcounter um z.B. alle 30 Sekunden eine Funktion aufzurufen welche dann diverse Jobs erledigt. Diese Funktion habe ich schon seit Jahren so im Einsatz. Jetzt vermehren sich plötzlich bei den ein oder anderen Anwender meines Tools ein seltsamer Effekt. Die Programmoberfläche lässt sich nicht mehr bedienen, reagiert auf keinen Klick mehr. Das Programmmenü ist nicht mehr bedienbar und das Programm lässt sich auch nicht mehr über das Taskicon beenden. Wird das Programm neu gestartet > gleiches Verhalten. Allerdings läuft der Timer nach wie vor im Hintergrund und verrichtet seinen Dienst, das Tool macht also alles was es soll, ich kann nur die Oberfläche nicht mehr bedienen. Deaktiviere ich dann den Timer über die gespeicherten Einstellungen (ini-Datei) und starte das Programm neu, reagiert es ganz normal. Dieses Verhalten habe ich aktuell bei 2 oder 3 Anwendern. Ich finde allerdings keinen Auslöser für dieses Verhalten. Hat hier vielleicht jemand eine Idee wo ich ansetzen kann um den Auslöser zu finden? Delphiversion: 11.3 32-bit Anwendung Betriebssystem bei den Anwendern ist Windows 11 Pro (64-bit) Vielen Dank im Voraus. |
AW: Probleme mit Timer
.. wenn Aktionen in einem Timer angestossen werden sind diese nicht vom MainTask getrennt.
Sind es also Zeitintensive Aktione - kann es passieren das der MainTask blockiert wird. Vielleicht hilft es, wenn Du die Sachen in einen Task oder Thread packst. Grüße Klaus |
AW: Probleme mit Timer
Der Timer läuft wahrscheinlich in eine Endlosschleife, innerhalb der kein ProzessMessages aufgerufen wird.
Auch denkbar, im Timer-Ereignis wird ProzessMessages aufgerufen, dauert die Abarbeitung aber bereits zu lange, löst der Timer dabei erneut aus und ruft das Ereignis rekursiv auf. |
AW: Probleme mit Timer
Zitat:
Now to suggestion 1) Are you using any sort of logging ? just log events and you can time the jobs triggered by the Timer, also the time spend on every job, this logging can be enabled and disabled from command line parameter, or any other method, but with command line you don't need to wait for application settings to be loaded, as loading settings might also be problematic or broken in specific user case. 2) Do you have a clear logic to handle, recover or coup, when and if one of these jobs takes longer than the Timer interval ? 3) Try to reproduce this by decreasing the interval to 30ms instead of 30 second, this might reveal problems on your side, also put some jobs to sleep for long time, then build your logic with that in mind. 4) is there a hidden error message ? like failed to be visible to the user or even to render ? also logging here. That what comes to mind at this moment, and hope it helps. |
AW: Probleme mit Timer
Wenn die Routine im Timer länger dauert als der Timer.Interval,, dann könnte es nach einiger Zeit krachen.
Ich mache es immer so, denn er exakte Timer-Interval ist mir sowieso zu ungenau ...
Delphi-Quellcode:
So bekommt man keine Probleme mit ungewolltem Timer-Flooding, oder auch auf langsameren Rechnern.
procedure TForm.TimerProcessTimer(Sender: TObject);
begin TimerProcess.Enabled := False; // Halte den Timer an, bis die Aufgabe erledigt ist ... // Erledige die Aufgabe erst komplett, auch wenn es länger dauert als der Timer-Zyklus ... TimerProcess.Enabled := True; // Werfe den Timer erst danach wieder an end; |
AW: Probleme mit Timer
Das sorgt nur dafür, dass zwischen Ende und neuem Anfang des TimerEvents "neue" 30 Sekunden (Interval) liegen.
Und selbst wenn es jedes Mal mindestens 30 Sekunden benötigt hängt, dann würden dennoch zwischen den Events alle angefallen Events verarbeitet. So oder so, ist es seine saublöde Idee etwas in einem Timer zu machen, was regelmäßig mindestens / mehr als 30 Sekunden benötigt. |
AW: Probleme mit Timer
Zitat:
Vielleicht ist die Aufgabe ja etwas, das zwingend im UI-Thread ausgeführt werden soll, wie Malen in einem Fenster oder so. Das Beispiel unten soll ja nur das mögliche Timer-Flooding sicher verhindern, falls das ein Problem für sporadische Fehler darstellen sollte. Trotzdem könnte auch ein Timer alle 30 Sekunden eine Aufgabe in einem Thread anwerfen, der dann mal 20-40 Sekunden braucht bis er fertig ist. Auch dann sollte man den Thread vor einem Flooding schützen. |
AW: Probleme mit Timer
Danke für Eure Hinweise und Empfehlungen.
Timer-Flooding würde ich ausschließen, da ich in der Tat den Timer anhalte und wieder starte, ähnlich wie es Rollo62 geschrieben hat... Threading kommt hier in der Tat auch nicht in Frage, da es unter Umständen in der Tat zur Interaktion kommen kann, dann ist der Timer aber meist eh schon deaktiviert. Ich muss da nochmal in mich gehen und die Abläufe und die Logik nochmal überdenken. Es irritiert mich halt nur, dass sich aktuell die Fälle häufen und voher über Jahre keine Probleme bekannt waren... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 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