[Delphi] Bij afsluiten wachten op lopende threads

Pagina: 1
Acties:

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Bij het afsluiten van mijn Delphi 7 applicatie wil ik wachten op eventuele threads die nog lopen. Hiervoor is een WaitFor methode in TThread, maar deze werkt alleen als FreeOnTerminate op False staat. Opzich kan ik die wel op False zetten maar waar geef ik dan mijn thread vrij. Dit kan namelijk niet in OnTerminate, omdat je dan een eeuwige lus krijgt.

Wat is een degelijke manier om te wachten op lopende threads en deze correct vrij te geven?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Een lijstje ervan bijhouden in je main thread, en na het wachten allemaal vrijgeven, denk ik.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Maar wanneer geef ik ze dan vrij als ik er niet op wacht. Dus als een thread gewoon klaar is en de applicatie niet wordt gesloten.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Hmmm...

Het eerste wat me te binnen schiet:

Zet een eigen OnTerminate handler. Die kan aan de hand van een variabele (ofzo) in de main thread zien of er afgesloten/gewacht wordt of niet.

Zoniet, dan Free't hij de thread. Zowel, dan doet hij niets.

Van de smerige kant, als je programma afgesloten wordt boeit het ook niet veel of je Thread objects wel of niet vrijgegeven worden, want zodra je proces afgelopen is wordt al het gealloceerde geheugen toch vrijgegegeven.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 08:25

Creepy

Tactical Espionage Splatterer

Wat je ook kan doen is de thread een message laten sturen (wel gesynchonised) naar de main thread welke dan weer de thread die de message verstuurde opschoont.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Je kan de API functie WaitForMultipleObjects gebruiken, zie MSDN. Hiervoor heb je een array met thread-handles nodig (TThread.Handle). Een registratie systeem voor threads is dus wel nodig.
Pagina: 1