Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Threads und Events (https://www.delphipraxis.net/167282-threads-und-events.html)

Viktorii 21. Mär 2012 09:29

Delphi-Version: XE2

Threads und Events
 
Moin.

Kann man Threads so mit Events verwenden, wenn die Methode StartNow von einem anderen bzw. Hauptthread aufgerufen wird, oder gibt es da irgendwelche Fallstricke?

Delphi-Quellcode:
type
  TMyThread = class(TThread)
  private
    FStart: TEvent;
  protected
    procedure Execute; override;
  public
    procedure StartNow();
  end;

implementation

procedure TMyThread.Execute;
begin

  FStart := TEvent.Create(nil, false, false, '');

  while not Terminated do
  begin
    //--- Auf StartEvent warten
    FStart.WaitFor(INFINITE);
    ...
    ...
  end;
end;

procedure TSweepThread.StartNow;
begin
  FStart.SetEvent;
end;

jaenicke 21. Mär 2012 09:59

AW: Threads und Events
 
Mit den originalen Events von Windows (CreateEvent, SetEvent, ...) ist das kein Problem. TEvent habe ich noch nie benutzt, aber ich vermute, dass das auch nur auf die API zugreift und es dann auch kein Problem sein sollte.

s.h.a.r.k 21. Mär 2012 10:54

AW: Threads und Events
 
Sehe da kein Problem.

Jup, TEvent kapselt nur API Aufrufe, soweit ich das noch weiß.

CCRDude 21. Mär 2012 10:56

AW: Threads und Events
 
Verwendest Du dabei die gleiche Variable FStart? Das mag funktionieren, weil das WaitFor ja unendlich wartet und da steht und solange mutmaßlich eh kein anderer Zugriff auf FStart stattfindet. Aber sauberer wäre imho ein named event, jeweils getrennt angelegt. So verfahre ich in etlichen Threads, meistens um Pausen einzubauen, die bei Programmende aber durch den Event-Trigger den Thread sofort beenden lassen.

Genauso würde ich nicht INFINITE warten, sondern eine vordefinierte Zeit, und stattdessen den Rückgabewert auswerten (entweder Timeout oder gewünschtes Signal). So braucht das Programm halt maximal jene vordefinierte Zeit und der Thread muss nicht auf die harte Tour getötet werden.

Stevie 21. Mär 2012 11:54

AW: Threads und Events
 
Du solltest an dieser Stelle THandleObject.WaitForMultiple nutzen, damit auch ein Terminate noch verarbeitet wird. Dazu musst du ein zweites Event erzeugen, welches im DoTerminate deiner Threadklasse signalisiert wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:51 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