Hallo zusammen,
mir liegt da was ziemlich schwer im Magen und bekomme es nicht raus. Habe schon sämtliche Foren und Tutorials durchforstet = 0 Erfolg.
Ich habe eine
Unit, in der ein Thread programmiert wurde. Beim starten wird diesem ein Wert übermittelt. Mit diesem Wert holt er sich in einer CriticalSection, Daten aus einem ListView der MainForm. Dieser werden dann vom Thread intern verarbeitet (netzwerkarbfagen, etc.) und in einer zweiten CriticalSection zurück in die ListView geschrieben. Soweit so gut.
jetzt mein Problem: Ich möchte immer 5 Threads gleichzeitig gestartet haben, um das ganze etwas flotter zu machen. Das klappt auch soweit ganz gut, nur möchte ich nachdem ein Thread fertig ist, einen neuen starten und genau da haperts bei mir.
Ich habe das ganze im moment mit einer prozedur in der MainForm versucht, die in einer CriticalSection gestartet wird und dann jeweils einen neuen Thread startet.
Hier mal mein Source:
MainForm:
Delphi-Quellcode:
var
tmpthread: Array of TImportThread;
const
maxthreads: Integer = 5;
procedure TfrmMain.StartThreads();
var
i: Integer;
begin
SetLength(tmpthread, maxthreads);
for i := 0 to maxthreads-1 do
begin
if i < lstInfo.Items.Count then
begin
tmpthread[i] := TImportThread.Create(True,False,i,i);
tmpthread[i].FreeOnTerminate := True;
tmpthread[i].Resume;
end;
end;
end;
procedure TfrmMain.StartNextThread(num,lstid: Integer);
begin
tmpthread[num].Terminate;
tmpthread[num].WaitFor;
if lstid < lstInfo.Items.Count-2 then
begin
tmpthread[num] := TImportThread.Create(True,False,num,lstid+1);
tmpthread[num].FreeOnTerminate := True;
tmpthread[num].Resume;
end;
end;
und Thread:
Delphi-Quellcode:
procedure TImportThread.Execute;
begin
CriticalSec.Enter;
try
// Hole Daten aus MainForm ...
finally
CriticalSec.Leave;
end;
// Verarscheite Daten ...
CriticalSec.Enter;
try
// Schreibe Daten in MainForm ...
frmMain.StartNextThread(threadid,listIndex);
finally
CriticalSec.Leave;
end;
end;
Jedem thread wird also seine Id (von 0 bis maxthreads-1) übergeben und welche Zeile er in der ListView abfragen soll.
In StartNextThread wird Terminate aufgerufen und dann gewartet, bis der Thread beendet ist. Danach wird ein neuer Thread mit der gleichen Id über den "toten" eintrag im Array erzeugt und lediglich der ListView Wert um 1 erhöht.
Doch irgendwie ist da der Wurm drin. Vielleicht mag sich ja einer meines Problems/Source annehmen und Verbesserungvorschläge geben. Arbeite noch nicht so ewig lange mit Thread, bin also noch ein kleiner Newbie in dem Thema.
Vielen Dank & Grüße
ddcool