AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Performanceprobleme beim Befüllen von TComboBoxen
Thema durchsuchen
Ansicht
Themen-Optionen

Performanceprobleme beim Befüllen von TComboBoxen

Ein Thema von m.pritscher · begonnen am 24. Jul 2025 · letzter Beitrag vom 31. Jul 2025
Antwort Antwort
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.071 Beiträge
 
Delphi 12 Athens
 
#1

AW: Performanceprobleme beim Befüllen von TComboBoxen

  Alt 25. Jul 2025, 13:17
Zusätzlich fällt auf, dass auch einfache Operationen wie "ItemIndex := -1" auf diese TComboBoxen
ebenfalls mehrere hundert Millisekunden (ca. 400–500 ms) benötigen.
Das sollte sich doch relativ einfach finden lassen:
Diese Aktion in eine Schleife packen und mehrfach ausführen (also mit unterschiedlichen Indizes). Dann laufen lassen und immer wieder im Debugger anhalten und schauen, was das Programm gerade macht...

Ansonsten gibt es Profiler, mit denen du genau siehst, was da passiert.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
m.pritscher

Registriert seit: 24. Jul 2025
6 Beiträge
 
Delphi 10 Seattle Professional
 
#2

AW: Performanceprobleme beim Befüllen von TComboBoxen

  Alt 28. Jul 2025, 10:41
Zusätzlich fällt auf, dass auch einfache Operationen wie "ItemIndex := -1" auf diese TComboBoxen
ebenfalls mehrere hundert Millisekunden (ca. 400–500 ms) benötigen.
Das sollte sich doch relativ einfach finden lassen:
Diese Aktion in eine Schleife packen und mehrfach ausführen (also mit unterschiedlichen Indizes). Dann laufen lassen und immer wieder im Debugger anhalten und schauen, was das Programm gerade macht...

Ansonsten gibt es Profiler, mit denen du genau siehst, was da passiert.

Beim detaillierten Überprüfen dieses Ansatzes sind wir auf den womöglich "wahren Übeltäter" gestoßen.
Der eigentliche Zeitfresser scheint das "WM_SETREDRAW" zu sein.

Delphi-Quellcode:
// ------------------------- Hauptsoftware ------------------------- //
procedure TFenster_EinstInterfaces2.ClearParVarPanel;
begin
  StartParVarTime := Now;
  LogProcedureStart('--- ClearParVarPanel ---');

  StartStepTime := Now;
  for i := 1 to 15 do
  begin
    hedit := TLabeledEdit(FindComponent('ledt' + IntToStr(i)));
    if hedit <> nil then
    begin
      hedit.Text := '';
      hedit.Hint := sDblClickForVar;
    end;
  end;
  LogTime('ledt-Schleife abgeschlossen', StartStepTime);

  StartStepTime := Now;
  // Redraw deaktivieren (WM_SETREDRAW False)
  for i := 1 to 15 do
  begin
    StartLoopTime := Now;
    hcombo := TComboBox(FindComponent('cmb' + IntToStr(i)));
    LogTime('FindComponent', StartLoopTime);
    if Assigned(hcombo) then
      SendMessage(hcombo.Handle, WM_SETREDRAW, WPARAM(False), 0);
    LogTime('SendMessage redraw', StartLoopTime);
  end;
  LogTime('WM_SETREDRAW false', StartStepTime);

  // Alle Index-Werte in Schleife setzen
  StartStepTime := Now;
  for i := 1 to 15 do
  begin
    hcombo := TComboBox(FindComponent('cmb' + IntToStr(i)));

    if hcombo <> nil then
    begin
      StartLoopTime := Now;
      hcombo.Items.BeginUpdate;
      try
        hcombo.ItemIndex := -1;
      finally
        hcombo.Items.EndUpdate;
      end;
      LogTime('ItemIndex für cmb' + IntToStr(i), StartLoopTime);
    end
    else
    begin
      LogTime('cmb' + IntToStr(i) + ' = nil', StartLoopTime);
    end;
  end;
  LogTime('cmb-Schleife abgeschlossen', StartStepTime);

  StartStepTime := Now;
  // Redraw reaktivieren und Controls invalidieren
  for i := 1 to 15 do
  begin
    hcombo := TComboBox(FindComponent('cmb' + IntToStr(i)));
    if Assigned(hcombo) then
    begin
      SendMessage(hcombo.Handle, WM_SETREDRAW, WPARAM(True), 0);
      RedrawWindow(hcombo.Handle, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN);
    end;
  end;
  LogTime('WM_SETREDRAW true', StartStepTime);

  LogTime('ClearParVarPanel gesamt:', StartParVarTime);
  LogProcedureEnd('--- ClearParVarPanel ---');
end;
Angehängte Grafiken
Dateityp: png Screenshot 2025-07-28 113449.png (86,7 KB, 56x aufgerufen)
Angehängte Dateien
Dateityp: txt logfile - 28-07-2025_10-44-10.txt (4,6 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
460 Beiträge
 
#3

AW: Performanceprobleme beim Befüllen von TComboBoxen

  Alt 31. Jul 2025, 12:56
Hi,
Beim detaillierten Überprüfen dieses Ansatzes sind wir auf den womöglich "wahren Übeltäter" gestoßen.
Der eigentliche Zeitfresser scheint das "WM_SETREDRAW" zu sein.
That log makes no sense, it looks like it is missing the reason of its use.

See, you missing core things to isolate, clearly the culprit is your approach with
1) FindComponent ! that thing is slow as turtle, you are repeating it and measuring it again and again....
2) What are these numbers in the scope "[xxx ms]" these makes no sense and not accumulate to the time on the left !?
3) I am afraid that "LogTime" and "LogProcedureEnd" have also something to do with efficient logging.

suggestion :
1) One FindComponent in that code and put them in a list if you want, and also measure it to put it this to rest.
2) Slice that procedure "ClearParVarPanel" into pieces, just simplify it as much as you can, one loop is more than enough, so either make it multiple procedures/functions or reduce it to %30 of its current lines.
3) Use one : either "WM_SETREDRAW" or "BeginUpdate..EndUpdate" but not both, these are messages and they are the same.
Kas
  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 18:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz