[Delphi] Sluiten app als thread loopt geeft error

Pagina: 1
Acties:
  • 133 views sinds 30-01-2008
  • Reageer

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Als ik een een thread net heb gestart en ik sluit dan mijn applicatie dan crashed de boel met een AV. Bij de OnClose van de MainForm heb ik al dit staan:
if ThreadRunning = True then Thread.Terminate;

Waar ik ThreadRunning bij het maken van de thread op True set en bij de OnTerminate event van de thread of False.

Maar dit werkt dus niet. Wat is wel een goede oplossing om er voor te zorgen dat de thread stopt bij het afsluiten zonder error's?

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


  • bramseltje
  • Registratie: September 2001
  • Laatst online: 08-09 15:10
Op maandag 24 december 2001 20:23 schreef jelmervos onder andere:
...
if ThreadRunning = True then Thread.Terminate;
...
Ik heb er niet zoveel verstand van, maar moet dat niet zijn 'if Threadrunning == True then Thread.Terminate();'?

Ik ben maar een leek hoor...

Bram

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Check topic titel, staat toch duidelijk [Delphi] :? :?
De syntax is verder goed hoor, anders kreeg ik die code toch niet door de compiler??? :? :?

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


Verwijderd

Als je Thread.Terminate aanroept wordt alleen de de boolean FTerminated op True gezet.

In de meeste Execute's van een thread ziet de code er als volgt uit:
code:
1
2
while not Terminated do
  DoeIets; // DoeIets is een procedure die niet al te lang duurt

Dus als het goed is zal je thread wel eindigen na het aanroepen van Terminate, maar dit kan nog ff duren; ligt eraan hoe lang 'DoeIets' duurt.

De class TThread heeft ook nog een method WaitFor, die wacht tot de thread eindigd; dus zet zoiets in je Destroy:
code:
1
2
  MyThread.Terminate;
  MyThread.WaitFor;

  • bramseltje
  • Registratie: September 2001
  • Laatst online: 08-09 15:10
:) Oh ja, sorry...

nou ja, ik heb het geprobeerd... ;(

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Aha, het komt er dus op neer dat ik of moet wachten (WaitFor) of ik moet while not terminated gebruiken. Maar in de Thread zelfs is dat DoeIets maar 1 regel, namelijk een TXMLDocument op Active := True zetten. Dit kan nog wel es wat langer duren, omdat hij de data van internet haalt.

Ik kan dus niet de Thread DIRECT stoppen en toch het geheugen goed vrij maken?

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


Verwijderd

Je kunt de win api TerminateThread gebruiken, maar dit staat in de help:
TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination. For example, TerminateThread can result in the following problems:
[..]
Maar wat is die TXMLDocument, Delphi 6 ofzo?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op maandag 24 december 2001 20:56 schreef DiFool het volgende:

Maar wat is die TXMLDocument, Delphi 6 ofzo?
Yep, Enterprise. Maar denk jij dat het slim is die ThreadTerminate te gebruiken?

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


Verwijderd

Nee, is denk ik niet slim.

Je zult het denk ik in die TXMLDocument moeten zoeken; maar daar kan ik helaas niets over zeggen; heb hier wel Delphi 6 liggen; maar nog geen tijd/zin gehad om het te installeren.

Maar als je je mainform hide-t en gewoon WaitFor aanroept, is dat een probleem?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op maandag 24 december 2001 21:09 schreef DiFool het volgende:

Maar als je je mainform hide-t en gewoon WaitFor aanroept, is dat een probleem?
Denk het niet, zal het na de nachtrust proberen. :) Je zit dan natuurlijk nog wel met een aantal dingen die OnThreadTerminate gebeuren, maar dat is op te lossen.

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


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Heb het ff getest, maar het werk helemaal niet.
Zodra je de app afsluit en de WaitFor functie aanroept van de Thread die dan dus draait dan geeft ie zodra de Thread klaar is deze error:
System Error. Code 6.
De ingang is ongeldig.
Klinkt als een probleem van het XMLDocument, omdat die Nederlands is (Windows).

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


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Hee, nu werkt het goed, maar ik weet niet of dit de goede oplossing is: ik heb gewoon de FreeOnTerminate weggehaald bij het aanmaken (en starten) van de Thread.

Hoe kan dit? Ik denk niet dat dit goed is, omdat hij nu een memory-leak heeft.

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


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

uhmm even denken

lifecycle van een thread:
1. Create(...)
2. Execute() (while not terminated do {iets} )
3. Terminate()
4. Free()


Waar het nu op lijkt het er op dat na stap 4 er nog objecten iets opvragen uit die thread. Dat geeft een AV.

Nu heb je 'free on terminate' uitgezet, waardor het opvragen van onzin uit je thread geen AV oplevert. Erg handig, maar het niet free-en van je thread is idd een memoryleak.

je zult uit moeten vogelen waar die AV exact veroorzaakt wordt. Op dat punt wordt er namelijk gelezen van je threadobject dat ondertussen gefreed is. Omdat je exeption niet noodzakelijkerwijs gegenereerd op het moment dat er gelezen word uit je object gelezen word, maar mogelijk ook later kan worden gegenereerd, wens ik je veel sterkte...

Localhost, sweet localhost

Pagina: 1