AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Code Teil hat viel zu viel CPU Auslastung
Thema durchsuchen
Ansicht
Themen-Optionen

Code Teil hat viel zu viel CPU Auslastung

Ein Thema von -=IOI=- · begonnen am 19. Aug 2005 · letzter Beitrag vom 19. Aug 2005
Antwort Antwort
-=IOI=-

Registriert seit: 5. Mär 2005
54 Beiträge
 
#1

Code Teil hat viel zu viel CPU Auslastung

  Alt 19. Aug 2005, 17:09
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Code Teil hat viel zu viel CPU Auslastung

  Alt 19. Aug 2005, 17:43
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);
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Code Teil hat viel zu viel CPU Auslastung

  Alt 19. Aug 2005, 20:10
Musst du jedesmal die Connection und Query neu erzeugen? Behalte sie doch während der ganzen Programmlaufzeit erzeugt.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
-=IOI=-

Registriert seit: 5. Mär 2005
54 Beiträge
 
#4

Re: Code Teil hat viel zu viel CPU Auslastung

  Alt 19. Aug 2005, 20:40
alles klar. danke für die tipps. werd das mal umsetzen und sehen, was bei raus kommt
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:04 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