Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Ende eines Threads dem Main-Thread mitteilen (https://www.delphipraxis.net/27331-ende-eines-threads-dem-main-thread-mitteilen.html)

DataCool 8. Aug 2004 12:05


Ende eines Threads dem Main-Thread mitteilen
 
Hi Leute,

ich habe 3-5 Threads im Hintergrund laufen, diese Threads erledigen diverse Aufgaben im Background.
Beendet werden die Threads indem ich für jeden Thread ein entsprechendes Events signalisiere !

Jetzt möchte ich gerne im Close meiner Main-Form, die verschiedenen Threads beenden(durch die jeweiligen Events) und möchte dann gerne von jedem einzelnen Thread eine Rückmeldung haben, das er sich erfolgreich beendet hat.
Wie mache ich das am Geschicktesten ?
Ich habe mir gedacht, das ich im OnTerminate des Threads eine WM_User + xyz Message an den Main-Thread schicke und beim Erhalt dieser Message eine Variable gleich true setze.
Diese Variable prüfe ich nach Signalisierung des Events zum Beenden solange ab, bis Sie true ist.

Oder gehts eleganter ?

SirThornberry 8. Aug 2004 12:14

Re: Ende eines Threads dem Main-Thread mitteilen
 
naja, du könntest dem OnTerminate eine Methode des Hauptfensters zuweisen. Ich habs in der Regel so gemacht.
Delphi-Quellcode:
type
  TMyThread = class(TThred)
  protected
    procedure Execute; override;
  public
    OnFertig: TNotifyEvent;
  end;
[...]
procedure TMyThread.Execute;
begin
  //do something until terminted
  if Assigned(OnFertig) then OnFertig(Self);
end;
{============================================}
[...]
var LThread: TMyThread;
begin
  LThread := TMYThread.Create(True);
  LThread.OnFertig := FThreadFertigProc;
  LThread.Resume;
end;

procedure TForm1.FThreadFertigProc;
begin
  //das machen was halt passieren soll wenn der Thread fertig ist
end;

DataCool 8. Aug 2004 12:20

Re: Ende eines Threads dem Main-Thread mitteilen
 
Hi SirThornberry,

nice way, thx

mischerr 8. Aug 2004 13:05

Re: Ende eines Threads dem Main-Thread mitteilen
 
Oder über SendMessage... Also über WParam und LParam liessen sich so noch Stati mitteilen wie Erfolgreich, Abbruch nach Fehler,... welche dann in einer MessageHandler-Routine im MainForm ausgewertet werden. Das dazu nötige Handle des MainForms könnte z.B. im Konstructor der Thread-Klasse übergeben werden.

Ich halte diesen Weg für ein wenig sicherer als ein Event. Denn was, wenn der Thread noch arbeitet, aber das MainForm bereits beim Beenden der App. zustört ist. Natürlich kann man einen solchen Fall verhindern, aber er ist doch theoretisch möglich...

Grüsse!

Luckie 8. Aug 2004 13:06

Re: Ende eines Threads dem Main-Thread mitteilen
 
Oder du nutzt MSDN-Library durchsuchenwaitforsingleobject um auf die Threads zu warten.

TStringlist 8. Aug 2004 20:21

Re: Ende eines Threads dem Main-Thread mitteilen
 
@DataCool

Meines Glaubens dürfte hier anstatt der 'WM_User + xyz Message' auch schon ein einfaches InterlockedExchange ausreichend sein.

Damit lädst du eine solche Variable (die im Main-Thread jeweils einem dieser Threads zugeordnet ist) dann nämlich gleich direkt vom jeweiligen Thread aus. In deinem Main-Thread brauchst du dann diesbezüglich keine Messages mehr zu empfangen, sondern im Close-Eventhandler nur noch mehr (exakt genauso wie bisher auch) diese Variablen auszuchecken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 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