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 2 von 2     12   
Benutzerbild von Meflin
Meflin

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

Re: Alle subThreads beenden beim programm beenden

  Alt 30. Jan 2004, 17:45
also, dateien werden bei dem ganzen nicht verwendet. normalerweise beenden sich die threads auch selber! das problem taucht nur auf, wenn der user wärend der threadlaufzeit das programm-schliesen-symbol drückt. wenn ich dann ein flag setzte, woher soll ich dann wissen, wie lange es dauert, bis alle threads beendet sind und die anwendung sauber beendet werden kann?
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

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

Re: Alle subThreads beenden beim programm beenden

  Alt 30. Jan 2004, 19:04
Hallo Meflin,

Du könntest ja bei jedem Erzeugen eines Threads z.B. einen Zähler mitlaufen lassen,
und beim Beenden der Form nachschauen ob der Zähler > 0 ist:


Delphi-Quellcode:
...
TYPE
  TForm1 = CLASS(TForm)
    Button1: TButton;
    PROCEDURE FormCreate(Sender: TObject);
    PROCEDURE FormCloseQuery(Sender: TObject; VAR CanClose: Boolean);
    PROCEDURE Button1Click(Sender: TObject);
  PRIVATE
    FThreadCounter: Integer;
    PROCEDURE HandleTerminate(Sender: TObject);
  PUBLIC
  END;
VAR
  Form1 : TForm1;

IMPLEMENTATION
{$R *.DFM}
Uses DeineThreadUnit;

VAR
  WorkerThread : TWorkerThread;

PROCEDURE TForm1.HandleTerminate(Sender: TObject);
// Behandlungsroutine, wenn Thread zerstört wird
BEGIN
  Dec(FThreadCounter);
END;

PROCEDURE TForm1.FormCreate(Sender: TObject);
BEGIN
  // Voreinstellung: 0 Threads aktiv
  FThreadCounter := 0;
END;

PROCEDURE TForm1.FormCloseQuery(Sender: TObject; VAR CanClose: Boolean);
// Form wird nur beendet, wenn kein Thread mehr aktiv ist
BEGIN
  CanClose := False;
  IF FThreadCounter > 0 THEN
    ShowMessage('Bitte Warten, Threads aktiv!')
  ELSE
    BEGIN
      IF Assigned(WorkerThread) THEN FreeAndNil(WorkerThread);
      CanClose := True;
    END;
END;

PROCEDURE TForm1.Button1Click(Sender: TObject);
// Viele, Viele Viele Threads erzeugen
BEGIN
  WorkerThread := TWorkerThread.Create(True);
    WITH WorkerThread DO
    BEGIN
      // Selbstzerstörung
      FreeOnTerminate := True;
      // ...
      // div. Übergaben an Properties des Threads
      // ...
      // Threadcounter erhöhen
      Inc(FThreadCounter);
      // Behandlungsroutine, wenn Thread zerstört wird
      OnTerminate := HandleTerminate;
      Resume;
    END;
END;
Armin P. Pressler

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

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

Re: Alle subThreads beenden beim programm beenden

  Alt 31. Jan 2004, 11:24
also, da es scheinbar keine einfachere möglichkeit gibt, beende ich alle threads einzeln.
aber: neues problem! ich beende also alle nohc laufenden threads beim OnClose mit endthread (ich verwende nicht das vcl-thread object) und das fenster verschwindet, keine fehlermeldungen, alles paletti... doch: der prozess der application läuft noch!!! was geht denn da schief?
  Mit Zitat antworten Zitat
Benutzerbild von APP
APP

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

Re: Alle subThreads beenden beim programm beenden

  Alt 31. Jan 2004, 17:39
Hallo Meflin,
Ich dachte nach Deinem letzten Posting, Du möchtest einfach nur warten,
bis sich alle Threads von selbst beendet haben und danach erst dem Anwender
erlauben das Fenster zu schließen.

Wenn Du aber alle offenen Threads auf einem Sitz beenden möchtest
würde ich bei VCL-Threads folgendes machen:

Delphi-Quellcode:
// Form1 Private
   FMyThreadList: TObjectList;

// Form1 create
   // False unterbindet das automatische Freigeben des Objekts in der Liste nach Delete.
   FMyThreadList:= TObjectList.create(False);

// Beim Erzeugen der Threads
   FMyThreadList.Add(WorkerThread);


PROCEDURE TForm1.HandleTerminate(Sender: TObject);
// Behandlungsroutine, wenn Thread zerstört wird
// Wenn sich ein Thread selbst beendet hat, muß die
// FMyThreadList aktualisiert werden.
VAR
  i : integer;
BEGIN
  FOR i := 0 TO FMyThreadList.Count - 1 DO
    IF Sender = FMyThreadList[i] THEN
      BEGIN
        FMyThreadList.Delete(i);
        Break;
      END;
END;

PROCEDURE TForm1.FormDestroy(Sender: TObject);
// Alle Threads killen, und warten bis sie fertig sind.
VAR
  i : integer;
BEGIN
  TRY
    FOR i := FMyThreadList.Count - 1 DOWNTO 0 DO
      BEGIN
        WITH TWorkerThread(FMyThreadList[i]) DO
          BEGIN
            // Verhindern, dass HandleTerminate aufgerufen wird
            OnTerminate := NIL;
            Terminate;
            WaitFor;
          END;
        FMyThreadList.Delete(i);
      END;
  FINALLY
    FMyThreadList.Free;
  END;
END;
Armin P. Pressler

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

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

Re: Alle subThreads beenden beim programm beenden

  Alt 1. Feb 2004, 09:59
hmmm... ich verwende aber nicht den vcl thread -/-

*MFG*
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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:22 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