Einzelnen Beitrag anzeigen

BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
495 Beiträge
 
Delphi 12 Athens
 
#1

Windows Thread-Performance wenn minimiert

  Alt 12. Sep 2022, 06:57
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)

Geändert von BigAl (12. Sep 2022 um 07:20 Uhr)
  Mit Zitat antworten Zitat