![]() |
Threads + CriticalSection bei FormClose schnell freigeben
Hallo,
ich habe mehrere, unabhängige Berechnungen durchzuführen, die jeweils ca. 15 Sekunden dauern. Diese lasse ich in mehreren Threads berechnen und zu einer globalen Liste hinzufügen (gesichert über eine CriticalSection). Was mache ich nun, wenn der Anwender das Programm beendet? Muß ich da warten bis alle Berechnungen zu Ende sind, um dann erst die globale Liste und die CriticalSection-Variable freizugeben? Was würde passieren, wenn ich nicht warte? Bereinigt dann Windows/Delphi den Speicher (globale Liste, CriticalSection) und was passiert mit den Threads (und deren Stacks, belegten Speicher)? Gibt es überhaupt eine Möglichkeit, das Programm schnell und sauber zu beendet? Anmerkung: Die 15s Berechnung kann ich nicht abbrechen, da ich am externen Code nichts ändern kann (also kein "if CancelThreads then exit;" einfügen). Vielen Dank für Eure Hinweise! Bernd
Delphi-Quellcode:
var List : TStringList;
LockList : TCriticalSection; CancelThreads : boolean; function WorkerThread(ThreadParam: integer): DWORD; stdcall; var AName:string; i:integer; begin for i:=0 to 10 do begin if CancelThreads then break; AName:=IntToStr(random(1000)); Sleep(15000); //die richtige Berechnung von AName dauert bei mir 15 Sekunden EnterCriticalSection(LockList); try List.Add(AName); finally LeaveCriticalSection(LockList); end; end; ExitThread(0); end; procedure TForm1.FormCreate(Sender: TObject); var i:integer; hThread:THandle; begin List:=TStringList.Create; CancelThreads:=false; InitializeCriticalSectionAndSpinCount(LockList,$FF); for i:=0 to 10 do begin hThread := CreateThread(nil, 0, @WorkerThread, nil, 0, nil); if hThread=0 then Beep else CloseHandle(hThread); end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var i:integer; begin CancelThreads:=true; //muß hier "sleep(15000);" eingefügt werden, damit sich alle Threads beenden können?? List:=nil; DeleteCriticalSection(LockList); end; |
Re: Threads + CriticalSection bei FormClose schnell freigebe
Zitat:
|
Re: Threads + CriticalSection bei FormClose schnell freigebe
CreateThread das ist nicht gut. Benutze lieber BeginThread, da sonst der Heap nicht threadsafe ist. Du musst dann allerdings noch die Aufrufkonvention stdcall entfernen.
|
Re: Threads + CriticalSection bei FormClose schnell freigebe
Zitat:
Delphi-Quellcode:
Aha! Danke für den Tipp!
CreateThread das ist nicht gut. Benutze lieber BeginThread, da sonst der Heap nicht threadsafe ist.
Kennt jemand eine Antwort auf meine Fragen? Bernd |
Re: Threads + CriticalSection bei FormClose schnell freigebe
Rein theoretisch könntest du die Threads alle abschiessen, wenn du den Prozess sowieso beendest. Da bleiben keine Spoeicherlecks oder so übrig, weil Windows den gesamten Adressraum des Prozesses nach dessen Beendigung wieder frei gibt. Problematisch wird es nur, wenn in den Threads dynamisch DLLs geladen werden. Denn dann wird der Referenzzähler auf die DLL nicht dekrementiert und wird immer größer null bleiben, so dass Windows die DLL nicht entläd, obwohl sie nicht mehr benötigt wird.
|
Re: Threads + CriticalSection bei FormClose schnell freigebe
Danke Michael!
Also für alle Threads TerminateThread() und dann gleich List:=nil und DeleteCriticalSection(LockList). Und was ist wenn ein Thread gerade in einer CriticalSection ist? Gibt es da keine Probleme? Bernd BTW: Bei einem anderen Programm habe ich das Problem, dass beim Aufruf von DeleteCriticalSection das Programm einfach weg ist (als ob ich "halt;" aufrufe bzw. wie ein Absturz ohne Fehlermeldung). Woran kann das liegen? |
Re: Threads + CriticalSection bei FormClose schnell freigebe
Zitat:
Delphi-Quellcode:
while not Terminated do
begin ...; ...; end; Zitat:
|
Re: Threads + CriticalSection bei FormClose schnell freigebe
Zitat:
Zitat:
Bernd PS: Muß ich in funktion WorkerThread() ExitThread aufrufen? Eigentlich nicht, oder? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 Uhr. |
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