Napisałem sobie taki wątek :
Tsendmail = class(TThread)
procedure pobierzmail(var adres:string); //pobira adres mail z pliku
procedure pobierzzaloncz(var IdMessage1: TIdMessage); //tworzy załączniki
procedure usunrecord(var XML:TXMLDocument); //usuwa rekord w xml
procedure wyslijmail; - //wysyła pocztę
private
{ Private declarations }
protected
procedure Execute; override;
public
XMLmail: TXMLDocument;
Status :BOOLEAN;
adres:string;
IdSMTP1: TIdSMTP;
IdMessage1: TIdMessage;
liczbazal:integer;
end;
Tu Execute :
procedure tsendmail.Execute;
var
i:integer;
begin
FreeOnTerminate := True;
Coinitialize(nil);
XMLmail:=TXMLDocument.Create(application);
IdMessage1:=TIdMessage.Create(application);
IdSMTP1:= TIdSMTP.Create(application);
form2.blad:=false;
setpathmail; - operacje na xml i idmesage,idsmtp i plikach rekordowych, wewnątrz również następuje wywoływanie innych procedur procedur wątku
wyslijmail; - operacje na xml i idmesage,idsmtp i plikach rekordowych, wewnątrz również następuje wywoływanie innych procedur procedur wątku, między innymi dla załączników usuwania pozycji w xml itp...
IdSMTP1.Free;
idsmtp1:=nil;
IdMessage1.Free;
IdMessage1:=nil;
XMLmail.Active:=false;
XMLmail.Free;
XMLmail:=nil;
end;
Wątek wywołuję tak :
wyslijp:=tsendmail.Create(false);
I mam z nim taki problem że nie wiem dla czego nie zwalnia mi pamięci po jego zakończeniu, jak patrzyłem w managera procesów Windowsa cały czas po wykonaniu wątków zajętość procesu w ram aplikacji zwiększa się, jest to aplikacja pisana na serwer więc kiedyś może się zapchać ram, a przecież zwalniam wszystkie komponenty i więcej struktur dynamicznych w tym nie man, może ten XML źle zwalniam ?? Wszystkie pliki rekordowe i tekstowe zmykam closefile(), zmienne mam zadeklarowane lokalnie w procedurach wiec chyba są zwalniane po zakończeniu działania mam tylko parę zmiennych globalnych dla formy, modyfikowanych przez wątek ale one zazwyczaj przyjmują wartość 0, lub są typu bool. Jeśli możecie rzucić okiem na powyższy kod byłbym wdzięczny za pomoc ??