Performance issue with TImageList

Performanceissue with TImageList

Update: This problem is solved with Delphi 10.1 Berlin

(Deutsche übersetzung im nachfolgenden Blog Eintrag)

Description of the problem:

Adding pictures to a Imagelist within a VCL application is very slow after a the change to Delphi 10 Seattle.

Usually adding pictures is very fast – as long as you act like this:

... 
iml: TImageList; 
...  
iml.BeginUpdate; 
try   
  for x in BigList do begin     
    iml.Add(x);
  end; 
finally   
  iml.EndUpdate; 
end;

One reason for a long time to add many pictures is, that clients of the imagelist get informed about every change on the list. To send this information just once and just at the end of all inserts we use BeginUpdate and EndUpdate.

This BeginUpdate and EndUpdate does not work like it should with Delphi 10 Seattle.

To understand this we look at the source coude:

Inheritance ot the TImageList:

Base is TBaseImageList in System.ImageList.

For FMX in Unit FMX.ImgList we have TCustomImageList >> TImageList

For VCL according in Unit VCL.ImgList: TCustomImageList >> TImageList

The methods BeginUpdate and EndUpdate in the base class looks like this:

 
procedure TBaseImageList.BeginUpdate; 
begin   
  if FUpdateCount = 0 then     
    Updating;   
    Inc(FUpdateCount); 
  end;  

procedure TBaseImageList.EndUpdate; 
begin   
  if FUpdateCount > 0 then begin
     Dec(FUpdateCount);
     if FUpdateCount = 0 then
       Updated;   
     end;
 end;

Both methods does what we expect.

Unfortunately the class TCustomImageList overwrite this for VCL (not override, not virtual!):

 
procedure TCustomImageList.BeginUpdate;
 begin
   Inc(FUpdateCount);
 end;

procedure TCustomImageList.EndUpdate;
begin   
  if FUpdateCount > 0 then 
    Dec(FUpdateCount);
  if FChanged then begin     
    FChanged := False;     
    Change;
  end;
end;

Updateing and Updated is not set anymore. UpdateCount is reintroduced and is not used further. The change method of the base class will call DoChange on every add – our BeginUpdate does not have effect.

Comparison to older sources of the VCL show that something went wrong here.

The solution of this problem indeed is easy: We just use the „good“ method of the base class.

Only problem: You have to check on further delphi versions, if there are may changes in the VCL method, which we do not want to skip, cause we do not execute them from now on.

I think this dephi bug will be solved in future – so we can go back to the original code.

...
iml: TImageList;
...
TBaseImageList(iml).BeginUpdate;
try
   for x in BigList do begin
     iml.Add(x);
   end;
 finally
   TBaseImageList(iml).EndUpdate;
 end;

Daimler

Referenzprojekt QuiX

Projektbeschreibung

Erstellung einer komplexen Big Data Applikation
(Datenbankanwendung, BI, Datawarehouse, Datamining, Reporting) zur Analyse und Auswertung von kundenspezifischen Daten im Bereich Qualitätsentwicklung, Kostencontrolling und Budgetplanung.

  • Erstellung und Präsentation eines Grobkonzeptes für das Gesamtsystem.
  • Fachliche Einarbeitung in das Thema BWL / Konzerncontrolling in der erforderlichen Tiefe.
  • Analyse der bestehenden heterogenen Systemlandschaft.
  • Definition der Anforderungen durch Diskussionen mit Fachabteilungen, IT Beauftragten und Sicherheitsspezialisten.
  • Entwurf des komplexen Datenmodells unter Einsatz eines Case-Tools.
  • Spezifikation der ETL Prozesse.
  • Erstellung eines detailierten Pflichenheftes/Lastenheftes.
    Notation gemäss firmenspezifischen Richtlinien und gemäss UML Standards.
  • Auswahl, Koordination und Anleitung eines Entwicklerteams.
  • Implementation der DB-Funktionalität in Oracle PL/SQL.
  • Implementation der Anwendungen für Client und Applikationsserver mit einem
    RAD (Rapid Aplication Development) Entwicklungssystem.
  • Erstellung des Dataminings sowie der Reports
  • Erstellung benutzerspezifischer Ausgabetemplates in MS Office und VBA.
  • Realisierung eines dynamischen Template Generators (Database Publishing Subsystem)
  • Umsetzung von Schnittstellen zu vor- und nachgelagerten Systemen.
  • Erstellung von Installationspackages.
  • Internationalisierung der Anwendung für die Sprachen Deutsch und Englisch.
  • Dokumentation des Gesamtsystems als Benutzerdokumentation, Entwicklerdokumentation und Administrator- und Betriebshandbuch.
  • Erstellung und Betrieb eines komplett gespiegelten Testsystems incl. der Generierung von Testdaten.
  • Analyse und Optimierung der Datenbankperformance.
  • Erweiterung des erfolgreichen Systems von PKW auf die komplette Konzernebene mit den Bereichen Truck, Van und Bus.
  • Anwendung von ALM-Tools zur Dokumentation und Weiterentwicklung, zur Versionsverwaltung und zum Änderungsmanagement
  • Durchführung von Performanceoptimierungen.
  • Bereitstellung eines Administrator- und Anwendersupports.
  • Stetige Weiterentwicklung des Systems unter Anwendung Agiler Methoden
  • Migration des Datenmodells und der Datenbank auf die jeweils aktuelle Oracle Datenbankversion.

Dimensionen

Anzahl der Anwender: ~ 50 Personen
Anzahl der Datentabellen: ~ 120
Datenvolumen gesamt: ~ 500 GB
Datenzuwachs pro Monat: ~ 1 Mio. Datensätze
Abfragen/Monat: ~2000 Auswertungen

Entwicklungsumgebung

Client Betriebssystem: MS Windows
Entwicklungssystem: Embarcadero Delphi Enterprise
Versionskontrollsystem: Subversion SVN
Datenbank: Oracle 8, Oracle 9, Oracle 10, Oracle 11, Oracle 12
Case-Tool: Resolution xCase

Technologien

Client/Server
Code-Generatoren
Objektorientierte Vorgehensweise

Für die Entwicklung der Software und den Betrieb der Anwendung wurde uns von der Daimler AG ein Referenzschreiben ausgestellt. Dieses kann gerne bei uns eingesehen werden.

Porsche

Software für Motorenmontage

Qualitätssicherungssystem für eine Montagehalle zur Motorenmontage. Datenkommunikation mit verschiedenster Prozesshardware. Visualisierung von Anlagenstadis bis hin zu einzelnen Verschraubvorgängen. Archivierung von Prozessdaten. Protokollierung von Montagezuständen.

Referenzprojekt Porsche – Motorenmontage

Image

Projektbeschreibung

Planung und Realisierung der Leittechnik zur Montage von Hochleistungsmotoren.

Client-Server Architektur bestehend aus 5 Arbeitsstationen, einem Prozessrechner und einem Oracle-Datenbankserver.

Funk-Kommunikation mit verschiedenster Prozesshardware.

Stammdatenverwaltung für Anlagenkonfiguration und Prozessablauf.

Datenarchivierung der Prozessdaten.

Datenbankabgleich mit kundenspezifischen Detaildatenbanken.

Realisierung von Notfallstrategieen.

Schulung der Werker, Instandhalter und Administratoren.