Autor Beitrag
Leto
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

XP
D7 Enterprise
BeitragVerfasst: Mo 26.07.04 20:00 
Hab in meiner Unit einen von TTHread abgeleitet Klasse, welche in FormCreate instanziert wird. Im Konstrukor initialisiert der Thread ein bisschen was und ruft dann die Methode Excecute auf. In der Execute-Methode wiederum läuft ein Codeblock in einer Ebdlosschleife. Diese Schleife soll erst dann beendet werden, wenn die Form geschlossen wird. dazu fange ich das Close-Ereignis ab und rufe darin MyThread.Terminate() auf.

ich dachte das funktioniert, aber sobald ich nochmal starte (über die IDE) kommt folgenden Fehlermeldung:
Zugriffsverletzung bei Adresse XYZ in Modul 'coreide70.bpl'. Lesen von Adresse ZYX.

Ich werd nicht daraus schlau. Ein Speicherleck? Woher?

Edit:
Schwamm drüber. Das Leck muss an meinem OS gelegen haben. Nach neustart kommt keine Fehlermeldung.

Bitte verschieben. Versehntlich falsch gelandet.

Anhang: Wenn ich beim Beenden meines Fensters den laufenden Thread terminieren und dann freigeben will (also die Klasse, die von TThread abgeleitet wurde), dann reagiert das fenster plötzlich nicht mehr. Destruktor ist leer.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  MyThread.Terminate();
  MyThread.Free(); //<-- Der Übeltäter
end;


Moderiert von user profile iconPeter Lustig: PHP- durch Delphi-Tags ersetzt
Moderiert von user profile iconUdontknow: Beiträge zusammengefasst, Thread verschoben

_________________
Carpe Noctem
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 26.07.04 22:38 
Hallo, Leto!

Bitte nutze demnächst die Delphi-Tags. PHP-Tags gibt es hier (aus verständlichen Gründen) nicht. :-)

Vielen Dank!
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Leto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

XP
D7 Enterprise
BeitragVerfasst: Mo 26.07.04 22:43 
Oh, alles klar. War ein Reflex, an den ich gar nicht dachte. Sorry.

_________________
Carpe Noctem
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Mo 26.07.04 22:46 
Moin!

1. Entwedern nach dem Terminate folgendes:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  Thread.Terminate;
  While Not Thread.Terminated Do
    Sleep(200);
  Thread.Free;


2. Oder du setzt die FreeOnTerminate Eigenschaft des Threads auf True, dann brauchst du nur noch Terminate aufrufen und der Thread gibt sich dann selber frei.

3. Oder hast du in deiner Execute Methode des Threads keine Bedingung die die Methode verlässt beim Terminate...

MfG
Muetze1
Leto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

XP
D7 Enterprise
BeitragVerfasst: Mo 26.07.04 23:00 
Hmmm... Erste Variante hat keinen Effekt (auh nciht bei Verzögerung von 5000 MS).

Und bei der zweiten variante wird bei mir scheinbar nicht der Destruktor aufgerufen.

_________________
Carpe Noctem
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Di 27.07.04 08:17 
manno, es reicht ein .Free. Terminate muss dann nicht explizit aufgerufen werden.

grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 27.07.04 08:31 
Was heisst denn nun Endlos-Schleife? Du prüfst doch wohl hoffentlich auf Terminated im Thread, oder? Der Befehl Terminate macht nämlich nichts, ausser die Terminated-Property des Threads auf True zu setzen. Daß der Thread dann auch tatsächlich aufhört zu arbeiten, dafür hat man selbst zu sorgen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TMyThread.Execute;
begin
  While not Terminated do
  begin 
    //Hier auszuführender Code...
  end;
end;


Cu,
Udontknow
Leto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

XP
D7 Enterprise
BeitragVerfasst: Di 27.07.04 10:14 
Das bezeichnete ich als "Endlosschleife".

Grad eben hab ich es nochmal angeschmiessen und nun läufts mit ohne Terminate. Sofern ein Free da ist läufts durch. Da fehlte wohl gestern ein Neustart? Kann mir das jemand erklären? Neigt Delphi dazu, den Speicher nach Terminierung des Programms nicht sauber freizugeben, bzw. Windows nicht da ran zu lassen?

Vielen Dank für Hilfen.

_________________
Carpe Noctem
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 27.07.04 10:50 
Eventuell wurden die dcu's nicht neu erstellt. Da hilft manchmal ein vollständiger Build oder das löschen der dcu's von den Units, die du selber geschrieben hast.