Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Code Teil hat viel zu viel CPU Auslastung (https://www.delphipraxis.net/51825-code-teil-hat-viel-zu-viel-cpu-auslastung.html)

-=IOI=- 19. Aug 2005 17:09


Code Teil hat viel zu viel CPU Auslastung
 
Ich sitze gerade an einem größeren Projekt, in dem mehrere Timer enthalten sind. Da das Programm recht viel an CPU Auslastung hatte, bin ich mal die einzelnen Timer durchgegangen, um zu überprüfen, woran das liegt und habe dabei einen Timer gefunden, der zwischen 15 und 20% CPU benötigt.
Hier mal der Code:

Delphi-Quellcode:
procedure TForm2.Timer5Timer(Sender: TObject);
var
  vQuery: TWmiQuery;
  vConnection: TWmiConnection;
  down, up : LongInt;
  mx, mx1, my, my1, i, ra, ra1 : Integer;
begin
  down := 0;
  up := 0;

  if IsInternetConnected = true then
  begin
  Timer6.Enabled := true;
  Timer7.Enabled := true;
  try
  vQuery := TWmiQuery.Create(nil);
  vConnection := TWmiConnection.Create(nil);
  try
    vQuery.Connection := vConnection;
    vQuery.WQL.Text := 'select * from Win32_PerfFormattedData_Tcpip_NetworkInterface WHERE Name="Sinus 154 stick - Paketplaner-Miniport"';
    vQuery.Open;
    down := round(vQuery.FieldValues['BytesReceivedPersec']/1024);
    vQuery.WQL.Text := 'select * from Win32_PerfFormattedData_Tcpip_NetworkInterface WHERE Name="Sinus 154 stick - Paketplaner-Miniport"';
    vQuery.Open;
    up := round(vQuery.FieldValues['BytesSentPersec']/1024);
  finally
    vQuery.Free;
    vConnection.Free;
  end;
  except
  end;
  end;

  try
  downgesamt := roundto(downgesamt + (down/1024), -2);
  upgesamt := roundto(upgesamt + (up/1024), -2);
  gesamt := StrToFloat(Label46.Caption) + downgesamt;
  Label41.Caption := FloatToStr(downgesamt) + ' MB';
  Label40.Caption := FloatToStr(upgesamt) + ' MB';
  Label42.Caption := 'Gesamt: ' + FloatToStr(roundto(gesamt/1024,-2)) + ' GB';
  except
  end;

  if down > 125 then down := 125;
  if up > 125 then up := 125;

  PaintBox3.Refresh;
  mx := 33;
  my := PaintBox3.Height;
  PaintBox3.Canvas.MoveTo(mx, my);
  PaintBox3.Canvas.Pen.Color := clNavy;
  for i := 0 to 125 do
  begin
    for ra := 25 downto 10 do
    PaintBox3.Canvas.LineTo(Round(mx-ra*cos(i*Pi/180)), Round(my-ra*sin(i*Pi/180)));
  end;
  PaintBox3.Canvas.MoveTo(mx, my);
  PaintBox3.Canvas.Pen.Color := clblue;
  for i := 0 to round(down) do
  begin
    for ra := 25 downto 10 do
    PaintBox3.Canvas.LineTo(Round(mx-ra*cos(i*Pi/180)), Round(my-ra*sin(i*Pi/180)));
  end;

  PaintBox4.Refresh;
  mx1 := 21;
  my1 := PaintBox4.Height;
  PaintBox4.Canvas.MoveTo(mx1, my1);
  PaintBox4.Canvas.Pen.Color := clNavy;
  for i := 180 downto 55 do
  begin
    for ra1 := 25 downto 10 do
    PaintBox4.Canvas.LineTo(Round(mx1-ra1*cos(i*Pi/180)), Round(my1-ra1*sin(i*Pi/180)));
  end;
  PaintBox4.Canvas.MoveTo(mx1, my1);
  PaintBox4.Canvas.Pen.Color := clblue;
  for i := 180 downto 180 - up do
  begin
    for ra1 := 25 downto 10 do
    PaintBox4.Canvas.LineTo(Round(mx1-ra1*cos(i*Pi/180)), Round(my1-ra1*sin(i*Pi/180)));
  end;

  try
  if IsInternetConnected = false then
  begin
    Label43.Caption := 'IP: 0.0.0.0';
    Timer6.Enabled := true;
    Timer7.Enabled := false;
    Timer5.Enabled := false;
  end;
  except
  end;
end;
Der Timer6, der noch vorkommt, läuft nur 5 sek, an dem kanns eigentlich nicht liegen und mit dem Timer7 zähl ich nur Sekunden, dass dürfte es auch nicht sein. Das Zeichnen von PaintBoxen hab ich auch an anderen Stellen des Programms, wo es auch keine Probleme gibt.

Ich vermute, dass es mit dem WMI-Auslesen zu tun hat (Internet Traffic).
Wenn jemand dafür eine andere Möglichkeit kennt, oder sonst eine Idee hat, wie ich die Performance verbessern kann, wär ich ihm sehr dankbar.

Gruß Flo

shmia 19. Aug 2005 17:43

Re: Code Teil hat viel zu viel CPU Auslastung
 
Zweimal genau die gleiche Query zu öffnen ist Quark:
Delphi-Quellcode:
    vQuery.WQL.Text := 'select * from Win32_PerfFormattedData_Tcpip_NetworkInterface WHERE Name="Sinus 154 stick - Paketplaner-Miniport"';
    vQuery.Open;
    down := round(vQuery.FieldValues['BytesReceivedPersec']/1024);
(* weg damit
    vQuery.WQL.Text := 'select * from Win32_PerfFormattedData_Tcpip_NetworkInterface WHERE Name="Sinus 154 stick - Paketplaner-Miniport"';
    vQuery.Open;
*)
    up := round(vQuery.FieldValues['BytesSentPersec']/1024);

Bernhard Geyer 19. Aug 2005 20:10

Re: Code Teil hat viel zu viel CPU Auslastung
 
Musst du jedesmal die Connection und Query neu erzeugen? Behalte sie doch während der ganzen Programmlaufzeit erzeugt.

-=IOI=- 19. Aug 2005 20:40

Re: Code Teil hat viel zu viel CPU Auslastung
 
alles klar. danke für die tipps. werd das mal umsetzen und sehen, was bei raus kommt


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 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