Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread innerhalb einer Komponente erzeugen und beenden (https://www.delphipraxis.net/70026-thread-innerhalb-einer-komponente-erzeugen-und-beenden.html)

DataCool 24. Mai 2006 11:40

Re: Thread innerhalb einer Komponente erzeugen und beenden
 
@Robert:

mache ich es so wie von Dir vorgeschlagen :

Delphi-Quellcode:
  if FCon2SvrThd <> Nil then begin
    FCon2SvrThd.Terminate;
    FCon2SvrThd.WaitFor;
  end;
  if FCon2SvrThd <> Nil then
    beep;
und rufe Cleanup am Ende des Execute des Threads auf, dann wird auch das Ereignis OnTerminate ausgelöst, setze ich aber da FCon2SvrThd := Nil;
Wird folgender Fehler ausgelöst :

Systemfehler. Code: 6.
Das Handle ist ungültig.

Noch ne Idee ?

Gruß Data

Robert Marquardt 24. Mai 2006 11:52

Re: Thread innerhalb einer Komponente erzeugen und beenden
 
Wieso unelegant? Wenn du am Ende deiner Arbeit aufraeumst, dann ist das doch noch Arbeit.

Du denkst einfach zu kompliziert. Der OnThreadEnded ist Unsinn und fliegt weg.
Delphi-Quellcode:
destructor TTestComp.Destroy;
begin
  // cleanup everything
  // ...

  StopThread;
 
  inherited Destroy;
end;

procedure TTestComp.OnConnection2SvrThreadEnded(Sender: TObject);
begin
  FCon2SvrThd := Nil;
end;

procedure TTestComp.StartThread;
begin
  FCon2SvrThd := TTwConnection2SvrThread.Create(Self, FTcpCon);
  FCon2SvrThd.OnTerminate:= OnConnection2SvrThreadEnded;
  FCon2SvrThd.Resume;
end;

procedure TTestComp.StopThread;
begin
  if Assigned(FCon2SvrThd) then
  begin
    FCon2SvrThd.Terminate;
    FCon2SvrThd.WaitFor;
    FCon2SvrThd := nil;
  end;
end;

DataCool 24. Mai 2006 12:00

Re: Thread innerhalb einer Komponente erzeugen und beenden
 
Hi Robert,

zu Deiner Überlegung das das OnThreadEnded unsinnig ist bin ich jetzt auch gekommen und habe es rausgeschmiessen.
Jetzt habe ich eigentlich genau den gleichen Code den Du gepostet hast.
Nur das ich den Destructor des Threads nicht überschrieben habe und somit auch kein StopThread habe.

Trotzdem funktioniert es im Moment !

Wozu noch das StopThread im Destructor ?

Gruß Data

Dale 24. Mai 2006 12:08

Re: Thread innerhalb einer Komponente erzeugen und beenden
 
Und wie beendest du jetzt den Thread?

Gruß Dale

Robert Marquardt 24. Mai 2006 12:09

Re: Thread innerhalb einer Komponente erzeugen und beenden
 
Wo bitte ueberschreibe ich den Destruktor des Threads?
StopThread ist eine (am besten private) Methode von TTestComp und muss natuerlich in deren Destruktor aufgerufen werden, da ja der Thread noch laufen kann.

DataCool 24. Mai 2006 12:16

Re: Thread innerhalb einer Komponente erzeugen und beenden
 
Hi Robert,

sorry mein Fehler hab mich total verlesen, Du überschreibst natürlich nicht den Destructor des Thread !!

Das was Du mit StopThread im Destructor der Komponente macht habe ich dort direkt aufgerufen, d.h. ich habe die
die Procedure StopThread nicht.
Werde Start-/StopThread jetzt aber noch einbauen, ist aufgeräumter und kann an anderen Stellen der Komponente so wiederverwendet werden.

Vielen Dank,

Gruß Data


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:18 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz