Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi nach beenden eines Threads, neuen starten (https://www.delphipraxis.net/108414-nach-beenden-eines-threads-neuen-starten.html)

ddcool 13. Feb 2008 09:13


nach beenden eines Threads, neuen starten
 
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

kaiser1401 13. Feb 2008 09:27

Re: nach beenden eines Threads, neuen starten
 
Hilft dir vll das OnTerminate Event von TThread weiter? dann musst du das nicht selber basteln an der Stelle.

ddcool 13. Feb 2008 10:19

Re: nach beenden eines Threads, neuen starten
 
Ja wunderprächtig. Hat alles geklappt. Da hätte ich mir ja gar nicht so die Seele aus dem Leibe reden brauchen. :-)

Vielen Dank für diesen Tipp!


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 Uhr.

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