Einzelnen Beitrag anzeigen

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