Hallo zusammen,
ich habe eine Thread geschrieben, welche Daten in möglichst exakten Abständen loggen soll. Das funktioniert soweit auch ganz gut, solange die Anwendung nicht minimiert ist. Sobald ich die Anwendung minimiere scheint Windows (Windows 11) die Thread zu verlangsamen. Solange die Anwendung nicht minimiert ist (auch wenn sie nicht das obere Fenster ist), dann ist der maximale Fehler bei ca. 1ms. Ist die App minimiert schwankt das ganze bis ca. 70ms.
Hier mal der Code aus der Thread:
Delphi-Quellcode:
repeat
try
// Calculate next log time.
LogTime := RoundTime(LogTime + FInterval / MSecsPerDay, FInterval);
CurrentTime := Now;
MSecsOff := Round((LogTime - CurrentTime) * MSecsPerDay);
if Abs(MSecsOff) > FInterval then // Resync...
begin
LogTime := RoundTime(CurrentTime, FInterval);
if LogTime > CurrentTime then
MSecsWait := Round((LogTime - CurrentTime) * MSecsPerDay)
else
MSecsWait := 0;
end
else
MSecsWait := Max(MSecsOff, 0);
FEvent.WaitFor(MSecsWait);
FEvent.ResetEvent;
if Terminated then
Break;
{$IFDEF DEBUG}
CurrentTime := Now;
TInterlocked.Exchange(Double(FLogTimeExact), CurrentTime);
TInterlocked.Exchange(FMSecsOff, Round((CurrentTime - LogTime) * MSecsPerDay));
{$ENDIF}
// Hier werden die Daten geschrieben...
except
// Fehlerbehandlung
end;
until Terminated;
Wobei RoundTime wie folgt implementiert ist:
Delphi-Quellcode:
function RoundTime(ATime: TDateTime; AToMS: Integer): TDateTime; inline;
var
RoundTarget: TDateTime;
begin
RoundTarget := SecsPerDay * (1000 / AToMS);
Result := Round(ATime * RoundTarget) / RoundTarget;
end;
Ich habe auch schon zum Test die Priorität der Thread bis auf "Time Critical" hochgesetzt. Ändert nichts.
Hat irgendjemand evtl. eine Idee wie man die Thread dazu bringen kann auch bei minimierter Anwendung die Performance beizubehalten?
Ich gehe mal davon aus, dass WaitFor (von TSimpleEvent) der Übeltäter ist.
Ich hoffe der Beitrag ist im richtigen Unterforum. Da ich aber erstmal davon ausgehe, dass der Hauptverursacher Windows ist, gehe ich davon aus, dass ich hier richtig bin...
Ach ja: Ehe eine Diskussion über die Genauigkeit von "Now" startet: Ich weiß, dass die Genauigkeit von Now üblicherweise im Bereich von 16ms oder so liegt. Das erklärt aber nicht das Verhalten...
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)