AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Alle subThreads beenden beim programm beenden
Thema durchsuchen
Ansicht
Themen-Optionen

Alle subThreads beenden beim programm beenden

Ein Thema von Meflin · begonnen am 29. Jan 2004 · letzter Beitrag vom 1. Feb 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#1

Alle subThreads beenden beim programm beenden

  Alt 29. Jan 2004, 15:23
Hi,
gibt es eine komfortablere möglichkeit, alle threads einer anwendung zu beenden, als deren
handle beim starten zu sichern und dann in einer for - schleife zu beenden?

*MFG*
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Alle subThreads beenden beim programm beenden

  Alt 29. Jan 2004, 19:48
Mit oder ohne VCL?

Egal wie sollte man es so programmieren, dass sich ein Thread selber beendet. Also im Thread in der Schleife einen Flag prüfen und wennd er einen bestimmten Wert hat die Schleife verlassen. Dieses Flag kannst du beim Programm Ende setzten.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von trifid
trifid

Registriert seit: 12. Sep 2003
297 Beiträge
 
#3

Re: Alle subThreads beenden beim programm beenden

  Alt 29. Jan 2004, 21:41
aber die Threads gehören zu einem Prozess
wenn der Prozess gekillt wird, werden auch die Threads zum Prozess vom Betriebssystem terminiert
oder gibts da noch was zu beachten
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Alle subThreads beenden beim programm beenden

  Alt 29. Jan 2004, 23:13
Saubere wäre es wohl, wenn sich die Threads alle vorher selber sauber beenden. Dass die Threads automatisch terminiert werden ist logisch. Wenn du den Prozess beendest, ziehst du ihnen ja praktisch den Teppich unter den Füßen weg. Ein Prozess ist nichts anderes als ein Container, der den Adressraum usw. bereitstellt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#5

Re: Alle subThreads beenden beim programm beenden

  Alt 29. Jan 2004, 23:15
Du könntest Probleme bekommen wenn dein Thread eine Datei schreibt oder liest...
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Alle subThreads beenden beim programm beenden

  Alt 30. Jan 2004, 04:04
Hallo Trifid,

Zitat von trifid:
aber die Threads gehören zu einem Prozess
wenn der Prozess gekillt wird, werden auch die Threads zum Prozess vom Betriebssystem terminiert
oder gibts da noch was zu beachten
bist Du Dir da sicher?
Ich habe das Zippen mit TP-Abbrevia in einen Thread ausgelagert, und meine, dass wenn ich beim Beenden des Prozesses nicht auf das Threadende warte bzw. ihn nicht vorsätzlich terminiere, dass dann der Thread weiterläuft, bzw. es zu "Seiteneffekten" (Exceptions) kommt...
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Benutzerbild von trifid
trifid

Registriert seit: 12. Sep 2003
297 Beiträge
 
#7

Re: Alle subThreads beenden beim programm beenden

  Alt 30. Jan 2004, 09:09
@APP
Zitat:
bist Du Dir da sicher?
das was jetzt Luckie beschrieben hat und das was ich weiss ... JEIN
ein NEIN bei Verwendung mit dem Delphi-Objekt TThread
ein JA mit den API's (CreateThread, ...)
mit C,C++ hatte ich weniger Probleme als bei Delphi

Zitat:
Ich habe das Zippen mit TP-Abbrevia in einen Thread ausgelagert, und meine, dass wenn ich beim Beenden des Prozesses nicht auf das Threadende warte bzw. ihn nicht vorsätzlich terminiere, dass dann der Thread weiterläuft, bzw. es zu "Seiteneffekten" (Exceptions) kommt...
Abbrevia ist thread-sicher programmiert (TAbPadLock),
(was aber nicht heisst, dass die Threads sauber beendet werden können)
also dürfte es nur daran liegen was GeorgeWNewbie geschildert hat.
Ich habe mir angewöhnt immer an die entscheidenden Stellen ein WaitForSingleObject oder
WaitForMultipleObjects zu stellen. (z.B. beim FormClose)

Verwendest Du das TThread-Objekt - da ist bei Terminierung ein Bug enthalten
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Alle subThreads beenden beim programm beenden

  Alt 30. Jan 2004, 10:08
@APP: Ein Thread ist ohne Prozess nicht lebensfähig! Da gibt es nichts dran zu rütteln. Aber wie geasgt, es könnte sein, dass es kracht, weil wenn du den Prozess beendest, dann nimmst du einen laufenden Thread seine Lebensgrundlage und manche finden das wohl nicht so toll und wehren sich vor ihrem Tod eben.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Alle subThreads beenden beim programm beenden

  Alt 30. Jan 2004, 10:10
Hallo Trifid,

Zitat von trifid:
Verwendest Du das TThread-Objekt (D5 u. D7) - da ist bei Terminierung ein Bug enthalten
ja, ich verwende das TThread-Objekt, kannst Du mir bitte sagen, wo der Bug ist?



@Trifid, @Luckie,

Ich habe obiges Posting "aus dem Bauch heraus" geschrieben, nachdem ich
um 2.00 Uhr früh in meine Fa. musste, und mir eine Wartezeit mit der DP verkürzte
-da war ich mir auch nicht sicher, ich beschrieb nur meine Erfahrungen
die ich mit Threads hatte.

Nun ließ mir das keine Ruhe und ich begann nachzulesen:

Andreas Kosch schreibt in "Delphi Win32 Lösungen" (Seite 298) folgendes:

Zitat von Delphi Win32 Lösungen:
[..]Aus diesem Grund muss jedes Handle über den Aufruf von CloseHandle
so früh wie möglich freigegeben werden. Dabei bedeutet das Freigeben des Handles nicht,
dass auch das Threadobjekt zerstört wird. Solange der Thread seine Aufgaben
noch nicht erledigt hat, führt das Schließen des Handles nicht zum Freigeben des Threadobjektes.

[..]
Win32 schließt alle Objekthandle selbstständig, wenn der zugrundeliegende Prozess terminiert.
Wichtig ist in dem Fall, dass eine Freigabe des Handles nicht automatisch das Threadobjekt zerstört,
und zwar unabhängig davon ob der Thread mit dem TThread Objekt oder durch die WinAPI erzeugt wurde.
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Alle subThreads beenden beim programm beenden

  Alt 30. Jan 2004, 10:20
Jupp, davon war aber gar nicht die Rede. Ein Thread-Handle kannst du sofort schließen, wenn du es nicht mehr brauchst. Mache ich in der Regel auch immer so, damit ich es nicht vergesse.

Ich benutze es meist nur, um zu kucken, ob alles geklappt hat:
Delphi-Quellcode:
    // Thread gleich starten
    hThread := BeginThread(nil, 0, @Thread, ThreadParams, 0, ThreadID);
    // wenn hThread <> 0 hat alles geklappt
    if hThread <> 0 then
    begin
      // nicht mehr benötigtes Thread-Handle schließen
      CloseHandle(hThread);
      // Schalflächen aktivieren / deaktivieren
      Button1.Enabled := False;
      Button2.Enabled := True;
    end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:53 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