Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Mehrere Threads gleichzeitig (https://www.delphipraxis.net/19689-mehrere-threads-gleichzeitig.html)

Frickel 7. Apr 2004 14:08

Re: Mehrere Thraeds gelichzeitig
 
Hallo Basilikum,

ja das scheinen die Fehler gewesen zu sein.
Habs jetzt mal geändert. So läuft es.

Wie stell ich es an, das ich benachrichtigt werden, wenn alle Threads beendet wurden??

Delphi-Quellcode:
TRY
  FOR i := 1 TO 10 DO
   T_ARR[i - 1] := T_TestThread.Create(i - 1, g_Datenbank.OutConnection);
FINALLY
  //Hier kommt wohl noch was hin
END;

UNIT AddressVerifaction;

INTERFACE

USES
  Classes, g_Database, Oracle;

TYPE
  T_TestThread = CLASS(TThread)
  private
    Buchstabe: Integer;
    fWorking:Boolean;
    PROCEDURE UpdateMemo(Sender: TObject);

    { Private-Deklarationen }
  protected
    PROCEDURE Execute; override;
  public
    CONSTRUCTOR Create(aBuchstabe: Integer; Connection: TOracleSession);
    PROPERTY Count: Integer read fCount write fCount;
    Property Working:Boolean Read fWorking Write fWorking;
  END;

IMPLEMENTATION
USES SysUtils, main;

CONSTRUCTOR T_TestThread.Create(aBuchstabe: Integer; Connection: TOracleSession);
BEGIN
  INHERITED Create(True);
  Buchstabe := aBuchstabe;
  FreeOnTerminate := True;
  OnTerminate := UpdateMemo;
  Working:=True;
  Resume;
END;

PROCEDURE T_TestThread.Execute;
VAR
  i: Integer;
  iSuccess: Boolean;
  RequestData: REQ_Satz;
BEGIN

  WHILE iSuccess DO
  BEGIN
    RequestData.A1 := '0';
    RequestData.A2 := '';
    RequestData.A3 := '';
    RequestData.A4 := '';
    RequestData.A5 := '';
    RequestData.A6 := '';
    RequestData.A7 := '';
    RequestData.A8 := '';
    iSuccess := g_Datenbank.GetRecord(RequestData);
    IF RequestData.A1 <> '0' THEN
    BEGIN
         //Verarbeite Daten
         Sleep(100);
    END;
  END;
  { Thread-Code hier einfügen }
END;

PROCEDURE T_TestThread.UpdateMemo(Sender: TObject);
BEGIN
   //Hier würde ich erwarten, das sich die Threads schön terminieren
   Working:=false;
END;

END.
Gruss Frickel

Basilikum 7. Apr 2004 14:26

Re: Mehrere Threads gleichzeitig
 
hm... irgendwie habe ich Dein Konzept noch nicht erkannt... aber trotzdem die Antwort auf Deine Frage
Zitat:

Zitat von Frickel
Wie stell ich es an, das ich benachrichtigt werden, wenn alle Threads beendet wurden??

Bei Thread-Begin würde ich mittels InterlockedIncrement eine "globale" Worker-Thread-Counter-Variable inkrementieren, bei Thread-Ende mittels InterlockedDecrement wieder dekrementieren. Wenn das Resultat von InterlockedDecrement 0 ist, war dies der letzte Thread... für die Benachrichtigung würde ich ein Event (CreateEvent) verwenden.. denkbar wären auch Messages (PostMessage)...

Zeitlich wäre es allerdings optimaler, immer 10 Threads laufen zu lassen und nicht zu warten, bis die ersten 10 fertig sind, und dann 10 neue starten... sprich: sobald nur noch 9 Threads laufen, muss der Master wieder einen starten....

APP 7. Apr 2004 18:45

Re: Mehrere Threads gleichzeitig
 
Hallo Frickel,
eine andere Lösung um zu erfassen wann alle Threads zerstört sind, habe ich
hier ( http://www.delphipraxis.net/internal...hlight=threads )
ziemlich weit unten gepostet. Vieleicht hilft Dir das als Ansatz.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:08 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz