Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi 2 ComboBoxen mit gleichem Inhalt füllen per Multithreading (https://www.delphipraxis.net/188781-2-comboboxen-mit-gleichem-inhalt-fuellen-per-multithreading.html)

DangerDistel 6. Apr 2016 21:19

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;

Delphi-Laie 6. Apr 2016 21:36

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.

Der schöne Günther 6. Apr 2016 21:41

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?

Delphi-Laie 6. Apr 2016 21:47

AW: 2 ComboBoxen mit gleichem Inhalt füllen per Multithreading
 
Erstmal muß klarwerden, was Multithreading überhaupt bezweckt und welche Grenzen es hat:

http://michael-puff.de/Programmierun...mit_Delphi.pdf
http://michael-puff.de/Programmierun...lphi_Demos.zip

DangerDistel 6. Apr 2016 21:48

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

Delphi-Laie 6. Apr 2016 22:01

AW: 2 ComboBoxen mit gleichem Inhalt füllen per Multithreading
 
Zwei Comboboxen mit dem gleichen Inhalt zu laden ist m.E. Redundanz.

Zitat:

Zitat von DangerDistel (Beitrag 1334845)
Ich frage nur ob ich per MultiThreading einen Geschwindigkeitszuwachs bekomm

Wahrscheinlich keinen oder bestenfalls kaum einen.

DangerDistel 6. Apr 2016 22:03

AW: 2 ComboBoxen mit gleichem Inhalt füllen per Multithreading
 
ok danke - dann hat sich´s erstmal :)

Fritzew 6. Apr 2016 22:16

AW: 2 ComboBoxen mit gleichem Inhalt füllen per Multithreading
 
Ändere mal

Code:
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;
Fritz

Delphi-Laie 6. Apr 2016 22:18

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.

Bernhard Geyer 6. Apr 2016 22:29

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 09:04 Uhr.
Seite 1 von 2  1 2      

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