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:
Jedem thread wird also seine Id (von 0 bis maxthreads-1) übergeben und welche Zeile er in der ListView abfragen soll.
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; 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 |
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.
|
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