Results 1 to 6 of 6

Thread: Starten van een thread en wat daarna...

  1. #1

    Starten van een thread en wat daarna...

    Vraag over onderstaande code. Moet ik na het aanroepen t := TSendThread.Create(1); ook nog iets doen. Bijvoorbeeld iets vrijgeven of zo. Ik ga straks in werkelijkheid (virtueel) een paar keer per minuut op de “Button” klikken. En dan wil ik niet dat mijn geheugen vol loopt met allemaal gestarte threads;-)

    Of is alles klaar en opgeruimd als TSendThread.Execute; uitgevoerd is.
    Code:
    type
      TSendThread = class(TThread)
      private
        MyValue: integer;
      protected
        procedure Execute; override;
      public
        constructor Create(aMyValue: integer);
      end;
    
    constructor TSendThread.Create(aMyValue: integer);
    begin
      inherited Create(False);
      fMyValue: integer := aMyValue;
    end;
    
    procedure TSendThread.Execute;
    begin
      // use fMyValueas needed...
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      t : TSendThread;
    begin
      t := TSendThread.Create(1);
    end;
    Niets is zo gemakkelijk als het lijkt.

  2. #2
    Zet de property “FreeOnTerminate” van de thread op true. Als de Execute klaar is wordt dan de thread ook opgeruimd

  3. #3
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Inderdaad.

    En misschien zou ik die twee regels code in de constructor omwisselen, want theoretisch gezien zou Execute nu kunnen lopen zonder dat FMyValue is toegewezen.

    Bovendien heb je de variabele t niet nodig. Indien wel, dan zal je FreeOnTerminate waarschijnlijk niet mogen gebruiken.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  4. #4
    Quote Originally Posted by NGLN View Post
    En misschien zou ik die twee regels code in de constructor omwisselen, want theoretisch gezien zou Execute nu kunnen lopen zonder dat FMyValue is toegewezen.
    Ik denk dat dat, zelfs theoretisch, niet mogelijk is. Execute kan nooit aangeroepen worden voordat Create helemaal klaar is. Dat zou alleen mogelijk zijn met een thread binnen een thread (wat hier niet het geval is). Execute zal dus altijd na Create uitgevoerd worden.

    Tevens is het volgens mij zelfs best practice om in een create altijd de inherited create als eerste aan te roepen.

  5. #5
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Oh ja, dat wordt inderdaad geregeld in AfterConstruction. Ik was altijd dus overdreven voorzichting met CreateSuspended = True. Thanks!
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  6. #6
    Bedankt voor jullie reacties. Het lijkt goed te werken.
    Niets is zo gemakkelijk als het lijkt.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •