Einzelnen Beitrag anzeigen

Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#1

Komisches Phänomen bei Threads. var array of meinthread.

  Alt 12. Mär 2010, 13:46
Servus,

das ganze ist ein wenig schwer zu beschreiben, aber ich versuche es mal.
Also ich habe einen Hauptthread. Threadmain. Der erstellt und verwaltet x Threads. ThreadSub.
Threadmain und Threadsub laufen in einer while bis sie beendet werden.

Threadsub erstellt noch y Threads, ThreadJob. ThreadJob wird aber beendet wenn er seine Arbeit erledigt hat.

Es werden ca. 5-10 ThreadSub erstellt je nach CPU Core.
ThreadJob, werden nur 2-4 erstellt, je nach CPU Core.

Jetzt kommt es zum Problem.
So erstell ich aus dem Threadmain die Threadsubs
Delphi-Quellcode:
  //Erstellen
  SetLength(fThreadSub, 8);
  for i:=0 to Length(fThreadSub) do
    fThreadSub[i] := TThreadSub.Create;

  //.....

  //Freigeben
  for i:=0 to Length(fThreadSub) do
  begin
    fThreadSub[i].Terminate;
    FreeAndNil(fThreadSub[i]);
  end;
Wenn ich 8 Threads erstelle, ohne Probleme, kein Fehler.
Wenn ich 7 Threads erstelle, kommt beim beenden eine EAccessViolation
Wenn ich 6 Threads erstelle, ohne Probleme, kein Fehler.
Schon komisch

Erstelle ich das ganze per Var und stecke das Object in einer liste, klappt auch alles, auch bei 7 Threads
Delphi-Quellcode:
  
  for i:=0 to 8 do begin
    fThreadSub := TThreadSub.Create;
    fThreadSub.MaxThreads := 2;
    fThreadSubList.Add(fThreadSub);
  end;

  //....

  for i:=fThreadSubList.Count-1 downto 0 do begin
    fThreadSub := TThreadSub(fThreadSubList.Items[i]);
    fThreadSub.Terminate;
    fThreadSubList.Delete(i);
  end;
  FreeAndNil(fThreadSubList);
Um fehler zu vermeiden habe ich den Threads auch nur eine while schleife genommen ohne Variablen und sonst was,
selbst da kam der Fehler. Und bei einem Fehler hat mir FastMM4 nur müll angezeigt. Sachen die ich gar nicht im Projekt verwende.

Hatte schon mal jemand so ein Problem......
Oder habe ich eventuell doch unsauber programmiert?

Mfg
  Mit Zitat antworten Zitat