Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TThread - OnTerminate (https://www.delphipraxis.net/9302-tthread-onterminate.html)

Motzi 24. Sep 2003 08:05

Re: TThread - OnTerminate
 
Arbeite mit einem Event..!

Im Thread wartest du einfach per WaitForSingleObject auf das Event - mit einem TimeOut von 60Sek. Der Rückgabewert von WaitForSingleObject gibt an, ob das Objekt signalisiert wurde (WAIT_OBJECT_0) oder ob die Zeit abgelaufen ist (WAIT_TIMEOUT).

Wenn dein Programm nun beendet werden muss, signalisierst du einfach das Event, dadurch weckt WaitForSingleObject deinen Thread auf und dieser weiß, dass er sich beenden muss.

Edit: nach dem signalisieren kannst du mit TThread.WaitFor noch warten bis der Thread wirklich vollständig abgearbeitet ist...

DataCool 24. Sep 2003 09:02

Re: TThread - OnTerminate
 
Dazu zwei Fragen :

1. Bekommst der Thread den, obwohl im nichtzuteilungsfähigen Zustand ist, das Event mit ?

2. Wie schicke ich diesen Event zum Thread ?

Gruß Data

P.S.: Kleines Bsp. wäre super

Motzi 24. Sep 2003 09:11

Re: TThread - OnTerminate
 
1) WaitForSingleObject kehrt in 2 Fällen zurück - entweder das Objekt auf das man wartet (in deinem Fall das Event) wird signalisiert, oder aber die TimeOut-Zeit läuft ab. Solange keines von beidem der Fall ist ist der Thread nicht zuteilungsfähig...

2) Beispiel kann ich dir im Moment nicht anbieten (frühestens am Nachmittag), aber schau dir mal im SDK/MSDN die Funktionen CreateEvent, SetEvent, .... an

DataCool 24. Sep 2003 09:17

Re: TThread - OnTerminate
 
Da warte ich doch gerne bis heut Nachmittag :mrgreen: :mrgreen:

Als mich jetzt durch das SDK zu wühlen und dann wieder Fehler drin zu haben.

Gruß Data

Motzi 24. Sep 2003 14:12

Re: TThread - OnTerminate
 
Du spendierst deinem Thread eine public Variable hCloseEvent, beim erzeugen des Threads erzeugst du dann das Event:
Delphi-Quellcode:
hCloseEvent := CreateEvent(nil, False, False, 'EventName');
Wichtig: Der EventName muss eindeutig sein - verwendest du also mehrere Threads musst du dir was überlegen wie du jedem Thread einen eindeutigen Namen für sein Event verpasst.

im Thread wartest du einfach mit WaitForSingleObject auf das Event:
Delphi-Quellcode:
repeat
  // normale Thread-Aktivität
until WaitForSingleObject(hCloseEvent, 60000) = WAIT_OBJECT_0;
Solange das Event also nicht signalisiert wird soll der Thread alle 60Sekungen zuteilungsfähig werden und ganz normal seine Aufgabe erfüllen. Sobald das Event signalisiert wird, wird der Thread zuteilungsfähig und WaitForSingleObject gibt WAIT_OBJECT_0 zurück wodurch die Schleife beendet wird.

Um das Event also zu signalisieren und dem Thread dadurch mitzuteilen, dass er beendet werden soll rufst du einfach aus dem MainThread SetEvent auf:
Delphi-Quellcode:
SetEvent(Thread.hCloseEvent);


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