Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Timer mit timeSetEvent pausiert bei z..B. Disk I/O (https://www.delphipraxis.net/164192-timer-mit-timesetevent-pausiert-bei-z-b-disk-i-o.html)

Aremo 2. Nov 2011 11:14

Timer mit timeSetEvent pausiert bei z..B. Disk I/O
 
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.

Medium 2. Nov 2011 11:45

AW: Timer mit timeSetEvent pausiert bei z..B. Disk I/O
 
Ist heute timeSetEvent-Tag? :)

Bummi 2. Nov 2011 11:48

AW: Timer mit timeSetEvent pausiert bei z..B. Disk I/O
 
Hierzu hätte ich eine grundsätzliche Frage, ist das Teil überhaupt sinnvoll einsetzbar, da der Code im Threadkontext ausgeführt wird.

Aremo 2. Nov 2011 12:29

AW: Timer mit timeSetEvent pausiert bei z..B. Disk I/O
 
Zur grundsätzlichen Frage:
Das Timer Event soll einfach nur Daten regelmäßig aus Schnittstelle abrufen und in einem Buffer speichern und einen Buffer-Pointer entsprechend hochzählen, sodass eine andere Routine regelmäßig nachschauen und auswerten kann. Anhand des Pointers auf das letzte Datenelement kann der jeweilige Stand abgelesen werden. Nur pausieren sollte das Abspeichen halt nicht.

Zum TimerSetEvent Tag:
Habe gerade gesehen ,dass auch Antworten dort
http://www.delphipraxis.net/158000-t...ml#post1133964
eingtroffen sind und werde Antworten auch dort eingeben. Danke für den Hinweis.

Medium 2. Nov 2011 12:53

AW: Timer mit timeSetEvent pausiert bei z..B. Disk I/O
 
Oh, jetzt sehe ich erstmal, dass der andere Thread ja ein älterer ist, der von deiner Antwort hochgelupft wurde. Ups :) Aber die Probleme sind ja nicht unverwandt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz