Registriert seit: 24. Nov 2009
Ort: Aachen
9 Beiträge
Delphi 10.1 Berlin Professional
|
Timer mit timeSetEvent pausiert bei z..B. Disk I/O
2. Nov 2011, 12:14
Hallo, ich habe einen Timer mit timeSetEvent erzeugt,
Timer_ID := timeSetEvent( Interval_inMSec, 0, @exec_routine, 0, TIME_PERIODIC );
der bislang zuverlässig funktioniert hat und alle 1 bis 10 mSec die Routine exec_routine ausführt.
Jetz ist jedoch aufgefallen, dass bei Disk I/O (schreiben einer Datei auf Platte) zum Beispiel der Timer jedoch pausiert, bis die Datei fertig geschrieben ist - was bei langsamen externen Medien bis zu 1 Sec oder mehr dauern kann. In der exec_routine wird ein Thread gestartet, der die höchste Priorität TimeCritical hat, aber was nützt mir die höchste Priortät dieses Threads, wenn der das Timer Event von "timeSetEvent" in solchen Fällen das Ausführen der exec_routine gar nicht erst ausgelöst wird.
QueryPerformanceFrequency( 1000 ) und QueryPerformanceCounter scheint auch keine ALternative zu sein, da mit QueryPerformanceCounter nur der Counter-Wert ausgelesen werden kann, die Routine aber selbst nicht die Ausführung eines Events oder routine einleiten kann. Die Implementierung einer Endlos-Schleife und Prüfung,ob der neue PerformanceCounter Wert erreicht ist führt jedoch zur sinnloser CPU-Belastung.
Gibt es eine Möglichkeit, die Priorität des Aufrufs selber hoch zu setzen oder eine andere Möglichkeit das pausieren zu vermeiden ? Habe schon die Forenbeitrage durchsucht, aber keine passende Lösung entdecken können.
Die Möglichkeit das Schreiben auf Platte in einen niedrig priorisierten Thread zu verlagern habe ich noch nicht getestet, allerding gibt es im Programm noch andere Events (mit onButtonPress ausgelöst) die auch den Timer pausieren lassen.
Gottfried Arens - Soft-dynamics.de
|