Einzelnen Beitrag anzeigen

ddcool

Registriert seit: 8. Jun 2003
146 Beiträge
 
Delphi XE2 Architect
 
#1

nach beenden eines Threads, neuen starten

  Alt 13. Feb 2008, 10:13
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
  Mit Zitat antworten Zitat