![]() |
2 ComboBoxen mit gleichem Inhalt füllen per Multithreading
Hallo :)
ich möchte, wie im Titel, 2 ComboBoxen separat mit dem gleichen Inhalt füllen. Ich beziehe die Quelle aus einer Liste. Die Liste besitzt aber mehr als 14000 Einträge. Meine Frage: Ich würde die gern per MultiThreading erledigen und welche Schritte wären dafür notwendig? Ich habe (leider) nie mit MultiThreading wirklich zu tun gehabt. Mein erster Ansatz daher:
Delphi-Quellcode:
procedure TfmPersonenverwaltung.FillStadtCB(Arr_ComboBoxes: Array of TComboBox);
var i_arr, ix: integer; begin if Length(Arr_ComboBoxes) > 0 then begin for i_Arr:=Low(Arr_ComboBoxes) to High(Arr_ComboBoxes) do begin if Arr_ComboBoxes[i_arr] <> nil then begin Arr_ComboBoxes[i_arr].Clear; for ix:=0 to GClassStaedteList.StaedteListe.Count -1 do begin Application.ProcessMessages; Arr_ComboBoxes[i_arr].AddItem(TStadtverwaltung(GClassStaedteList.StaedteListe[ix]).StdV_Plz + ', ' + TStadtverwaltung(GClassStaedteList.StaedteListe[ix]).StdV_Ort, TObject(TStadtverwaltung(GClassStaedteList.StaedteListe[ix])) ); end; end; end; end; end; |
AW: 2 ComboBoxen mit gleichem Inhalt füllen per Multithreading
Multithreading ist hier nicht nur überflüssig, sondern unsinnig, weil die Boxen beide vom VCL-Thread aus gesteuert werden.
Ergänzung: Von Multithreading ist in Deiner Prozedur auch weit und breit nichts zu sehen. |
AW: 2 ComboBoxen mit gleichem Inhalt füllen per Multithreading
Alternativ könnte man sich die Frage stellen ob man wirklich die Zielgruppe bedient die Zeit hat, sich zwei mal 14.000 Einträge anzusehen. Bist du sicher dass eine Combobox das ist, was du suchst?
|
AW: 2 ComboBoxen mit gleichem Inhalt füllen per Multithreading
Erstmal muß klarwerden, was Multithreading überhaupt bezweckt und welche Grenzen es hat:
![]() ![]() |
AW: 2 ComboBoxen mit gleichem Inhalt füllen per Multithreading
Es ist eine MDI - Anwendung
Das Child - Formular erzeuge ich beim Aufruf und damit werden diese Einträge wieder geladen. Da es bei diesem Aufruf - 2 ComboBoxen sind, lade ich die ganzen Einträge neu. Ich frage nur ob ich per MultiThreading einen Geschwindigkeitszuwachs bekomm, oder wie ich einen Geschwindigkeitszuwachs erhalte |
AW: 2 ComboBoxen mit gleichem Inhalt füllen per Multithreading
Zwei Comboboxen mit dem gleichen Inhalt zu laden ist m.E. Redundanz.
Zitat:
|
AW: 2 ComboBoxen mit gleichem Inhalt füllen per Multithreading
ok danke - dann hat sich´s erstmal :)
|
AW: 2 ComboBoxen mit gleichem Inhalt füllen per Multithreading
Ändere mal
Code:
Fritz
if Length(Arr_ComboBoxes) > 0 then
begin for i_arr := Low(Arr_ComboBoxes) to High(Arr_ComboBoxes) do begin if Arr_ComboBoxes[i_arr] <> nil then begin // add Arr_ComboBoxes[i_arr].Items.BeginUpdate; try Arr_ComboBoxes[i_arr].Clear; for ix := 0 to GClassStaedteList.StaedteListe.Count - 1 do begin // Application.ProcessMessages; Arr_ComboBoxes[i_arr].AddItem(TStadtverwaltung(GClassStaedteList.StaedteListe[ix]).StdV_Plz + ', ' + TStadtverwaltung(GClassStaedteList.StaedteListe[ix]).StdV_Ort, TObject(TStadtverwaltung(GClassStaedteList.StaedteListe[ix]))); end; // Add finally Arr_ComboBoxes[i_arr].Items.EndUpdate; end; end; end; end; |
AW: 2 ComboBoxen mit gleichem Inhalt füllen per Multithreading
Das Problem ist, daß die Comboboxen nur in einem Thread - dem VCL-Thread - laufen. Diese zu füllen, egal wieviele, läuft deshalb nur mit Singlethreadgeschwindigkeit (neudeutsch: Flaschenhals). Zugriffe anderer Threads (oder auch nur eines) erfordern zudem eine Synchronisation, d.h., daß diese sich sozusagen anstellen und auf die Bereitschaft des VCL-Threads warten müssen.
Das heißt allerdings nicht, daß Multithreading, das um den zentralen VCL-Thread herum abläuft, per se überflüssig oder unsinnig wäre. |
AW: 2 ComboBoxen mit gleichem Inhalt füllen per Multithreading
TComboBox basiert auf eine Win-Control und dessen Handle sind nur im erzeugenden Thread gültig/nur in diesem Thread darf darauf zugegriffen werden.
Den größten Geschwindigkeitszuwachs wirst du erhalten wenn du eine Combobox-Implementierung findest die nicht auf das Win-Control basiert und eine reine Delphi-Implementierung darstellt. Die größte Zeit beim Füllen einrt ComboBox wird man mit dem ganzen nötigen Windows-Messages benötigen die zum füllen nötig sind. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 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