Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - 100 Threads werden nicht komplett erzeugt in for schleife


NOS1971 - Di 30.07.13 22:31
Titel: 100 Threads werden nicht komplett erzeugt in for schleife
Hallo zusammen,

ich habe im moment ein phänomen welches ich nicht ganz einordnen kann ... ich arbeite an einem webspider und habe den threadpool und die settings in ein objekt gepackt ... die threads sind in einem dynamischen array und sollen beim callen aus dem mainform in der routine startanalysis erzeugt werden

standard sind als maxwert 100 angegeben


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
 for threadcounter := 0 to FMaxThreadCount - 1 do
 begin
  // create thread
  FURLAnalyserThreadPool[threadcounter] := TURLAnalyser.Create(FFormHandle,FMaxSleepTime,FMaxRetryCount,FAnalyseURL,FMaxAnalysisItems);
  FURLAnalyserThreadPool[threadcounter].FreeOnTerminate := true;
  Delay(FCreationDelay);
 end;


nach diesen zeilen kommt noch ein postmessage das die startroutine durch ist .... beim starten der threads suchen die threads die nächste zu analysierende url aus einem tdictionary ...
wenn die einträge im tdictionary = der anzahl der analysierten einträge und die anzahl der aktiven threads = 0 dann rufe ich die routine endanalyses des objektes auf - hier ein auszug


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
 // terminate threads
 for i := 0 to FMaxThreadCount - 1 do
 begin
  if FURLAnalyserThreadPool[i] <> nil then
  begin
   if FURLAnalyserThreadPool[i].Terminated then
   begin
   end
   else
   begin
    FURLAnalyserThreadPool[i].Terminate;
   end;
  end;
 end;


diese routine läuft komplett durch ... danach gibt es eine AV ... es ist wohl so das die erste routine des startens nicht komplett durchläuft ... unabhängig ob ich delay nutze oder nicht

hat jemand eine idee woran das liegen könnte oder was ich falsch mache ?

Grüßle und Danke,
Andreas


jaenicke - Mi 31.07.13 06:20

Du setzt FreeOnTerminate auf True, greifst aber dennoch nach der Erzeugung der Threads auf die Threadobjekte zu. Das ist logisch nicht möglich, da du nicht weißt wann diese freigegeben werden. Es geht nur entweder oder.

Wenn du ohnehin später die Threads ggf. beenden willst, wofür dann FreeOnTerminate? Einfach am Ende ein Terminate bei allen Threads, dann in einer weiteren Schleife WaitFor und Free, fertig.


NOS1971 - Mi 31.07.13 21:02

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Du setzt FreeOnTerminate auf True, greifst aber dennoch nach der Erzeugung der Threads auf die Threadobjekte zu. Das ist logisch nicht möglich, da du nicht weißt wann diese freigegeben werden. Es geht nur entweder oder.

Wenn du ohnehin später die Threads ggf. beenden willst, wofür dann FreeOnTerminate? Einfach am Ende ein Terminate bei allen Threads, dann in einer weiteren Schleife WaitFor und Free, fertig.



Also es ist so dass ich im Execute des Threads folgendes habe


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
initkram

while not terminated do
begin

mach was

end;

deinit


und wenn ich das recht gelesen habe setzt das terminate ja nur das Terminated flag auf true ... also ist das doch eigentlich korrekt so oder habe ich das grundlegend falsch verstanden ?