AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Komisches Phänomen bei Threads. var array of meinthread.
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Jackie1983 · begonnen am 12. Mär 2010 · letzter Beitrag vom 12. Mär 2010
Antwort Antwort
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
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 12. Mär 2010, 14:31
Das geht ja gar nicht:

Delphi-Quellcode:
    
fThreadSub[i].Terminate;
FreeAndNil(fThreadSub[i]);
Das Terminate setzt nur das property Terminated auf true. Im Execute muss dieses dann abgefragt und die Methode verlassen werden. Nach ein paar Aufräumarbeiten ist der Thread dann beendet.

Mit dem FreeAndNil direkt hinter Terminate entziehst du dem Thread in den meisten Fällen seinen Speicherbereich bevor er sich beenden konnte.

Als Lösung auf die Schnelle würde ich zwei Schleifen daraus machen: die erste ruft nur Terminate auf, während die zweite für jeden Thread ein WaitFor aufruft und den Thread danach freigibt.

Es ist zwar aus deinem Code nicht ersichtlich, aber ich vermute, du erzeugst die Threads mit FreeOnTerminate=false. Alternativ kannst du die Threads auch mit FreeOnTerminate=true erzeugen und nach dem Terminate einfach den Array-Eintrag auf nil setzen:

Delphi-Quellcode:
    
//Erstellen
SetLength(fThreadSub, 8);
for i:=0 to Length(fThreadSub) do begin
  fThreadSub[i] := TThreadSub.Create;
  fThreadSub[i].FreeOnTerminate := true;
end;

//...
 
//Freigeben
for i:=0 to Length(fThreadSub) do
begin
  fThreadSub[i].Terminate;
end;

for i:=0 to Length(fThreadSub) do
begin
  fThreadSub[i].WaitFor;
  fThreadSub[i] := nil;
end;
Uwe Raabe
  Mit Zitat antworten Zitat
Jackie1983

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

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

  Alt 12. Mär 2010, 14:54
Zitat von Uwe Raabe:
Das Terminate setzt nur das property Terminated auf true. Im Execute muss dieses dann abgefragt und die Methode verlassen werden. Nach ein paar Aufräumarbeiten ist der Thread dann beendet.
Das weis ich, so wird es ja auch gemacht. while not terminated do .....

Zitat von Uwe Raabe:
Als Lösung auf die Schnelle würde ich zwei Schleifen daraus machen: die erste ruft nur Terminate auf, während die zweite für jeden Thread ein WaitFor aufruft und den Thread danach freigibt.
Wuste nicht das es ein WaitFor gibt. Lol ich habe bei einigen Threads per Variable die Funktion nach programmiert, und dabei gibt es die schon von haus aus....
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#4

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

  Alt 12. Mär 2010, 15:32
Das geht auch noch einfacher... Threads besitzen eine Eigenschaft .FreeOnTerminate, die standardmäßig True ist. Ist dies der Fall geben sich die Threads selbstständig frei!
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Jackie1983

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

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

  Alt 12. Mär 2010, 15:37
Ok dann weis ich aber nicht wann die Threads beendet wurden.
Weil der Thread soll nicht abgebrochen werden, wenn das Programm geschlossen wird.

Heist wenn ein Thread einen langen job hat darf der Thread erst beendet werden wenn der Jon fertig ist
und demnach darf das Programm auch erst geschlossen werden wenn alle Threads beendet wurden.
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#6

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

  Alt 12. Mär 2010, 15:42
Hier eignet sich das Ereignis .OnTerminate hervorragend
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:18 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