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 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:
| 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
jaenicke hat folgendes geschrieben : |
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 ?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!