AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Ende eines Threads dem Main-Thread mitteilen
Thema durchsuchen
Ansicht
Themen-Optionen

Ende eines Threads dem Main-Thread mitteilen

Ein Thema von DataCool · begonnen am 8. Aug 2004 · letzter Beitrag vom 8. Aug 2004
Antwort Antwort
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#1

Ende eines Threads dem Main-Thread mitteilen

  Alt 8. Aug 2004, 13:05
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 ?
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Ende eines Threads dem Main-Thread mitteilen

  Alt 8. Aug 2004, 13:14
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Ende eines Threads dem Main-Thread mitteilen

  Alt 8. Aug 2004, 13:20
Hi SirThornberry,

nice way, thx
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
238 Beiträge
 
Delphi 12 Athens
 
#4

Re: Ende eines Threads dem Main-Thread mitteilen

  Alt 8. Aug 2004, 14:05
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!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Ende eines Threads dem Main-Thread mitteilen

  Alt 8. Aug 2004, 14:06
Oder du nutzt MSDN-Library durchsuchenwaitforsingleobject um auf die Threads zu warten.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Ende eines Threads dem Main-Thread mitteilen

  Alt 8. Aug 2004, 21:21
@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.
MfG (& Thx ggf.)
  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 10:37 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