Da im Grunde der komplette Thread/Task sinnlos ist, weil praktisch ALLES im Haupthtread abläuft,
ist der Haupthead somit voll ausgelastet.
Entweder es ist möglich EXCEL und gArt_Liste im Thread zu nutzen,
oder die unzähligen Synchronisierungen fressen nur unnötig viel Zeit/Ressourcen.
Das Einzige, wozu es sowas gut ist: Es verschwendet sinnlos mehr Rechenleistung, um anderen Threads zwischendrin bissl Rechenzeit abzugeben,
und das kann man auch selber machen.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
var
i: integer;
begin
Memo1.Lines.add('Thread-Beginn ' + TimeToStr(Now));
try
for i := 0 to ExcelZeilen -1 do
begin
frmArtikelListe.gArt_Liste.Add(i +1,
EXCEL.ZellenInhalt(i + 1,1), EXCEL.ZellenInhalt(i + 1, 2));
if i mod 100 = 0 then
Application.ProcessMessages;
end;
except
Memo1.Lines.add('Fehler ' + TimeToStr(Now));
end;
Memo1.Lines.add('Thread-Ende ' + TimeToStr(Now));
EXCEL.Free;
ActivityIndicator1.Animate := FALSE;
GridAusgabe;
end;
Wobei ich ungern unberechenbare "Abtände" haben möchte und daher lieber mit berechenbaren Zeiten arbeite.
Delphi-Quellcode:
C := GetTickCount;
for i := 0 to ExcelZeilen -1 do
begin
frmArtikelListe.gArt_Liste.Add(i +1,
EXCEL.ZellenInhalt(i + 1,1), EXCEL.ZellenInhalt(i + 1, 2));
if (GetTickCount - C) > 100 then begin // siehe unten
Application.ProcessMessages;
C := GetTickCount;
end;
end;
z.B. mal mit 50, 100, 250 oder 500 Millisekunden ausprobieren, wobei 100 bis 250 oft gut aussehen.
Persönlich würde ich auch empfehlen OnCreate/Constructor nicht unnötig lange laufen zu lassen.
Wie wäre es mit OnShow?