DeleteFile -> wyciek pamięci tylko w wątku

0

Mam dość dziwny problem. Jeśli wykonam

deleteFile('a.txt')

z buttona na formie to nie mam wycieku pamięci ale jeśli wykonam z wątku to mam wyciek 1x AnsiString. poniżej szczegóły:

Wyciekł blok pamięci. Rozmiar wynosi: 52

This block was allocated by thread 0x458, and the stack trace (return addresses) at the time was:
402AAB [system.pas][System][@GetMem][2447]
404CDD [system.pas][System][@NewAnsiString][11874]
404FEB [system.pas][System][@LStrCatN][12473]
6926DD [Raf_System.pas][Raf_System][TUpdate.Execute][411]
43046D [classes.pas][Classes][ThreadProc][9372]
402ACB [system.pas][System][@FreeMem][2474]
404BAE [system.pas][System][ThreadWrapper][11562]
753D33AA [BaseThreadInitThunk]
77C59EF2 [Unknown function at RtlInitializeExceptionChain]
77C59EC5 [Unknown function at RtlInitializeExceptionChain]

Blok jest aktualnie używany w obiekcie klasy: AnsiString
0

może dasz coś więcej kodu a nie jakiś marny kawałek. Cały kod wątku np.

0
procedure TUpdate.Execute;
label error;
var
  x : integer;
begin
  FreeOnTerminate := True; 

Error: //Podczas pobierania wystąpił błąd wiec zacznij od nowa
  while not Terminaten do begin
    DeleteFile(Path+FolderUpdate+FileUpdater);   {Gdy to usunę nie mam wycieku}  
    while not Updatecheck do
      if RS then
      begin
        For x := 1 to WaitRefresh*240 do
        begin
          Sleep(250);
          if SSleep then Break;
        end;
        SSleep := False;
      end
      else Suspend;
    case DownloadUpdate of
      -1..0 : begin Synchronize(ErrorDownload); Suspend; goto Error; end;
   end;
    Synchronize(ReadyUpdate);
    if not Terminaten Then Suspend;
  end;
end;
0
  1. skąd się to bierze Path+FolderUpdate+FileUpdater - gdzie jest zadeklarowane
  2. goto poważnie???
0

Path: string podczas włączenia programu ->

ExtractFilePath(Application.ExeName);

Pozostałe są stałymi w UConst.pas.

Goto -> to tak na szybko, zastąpie to poleceniem Continue

0

Pewnie zamykasz aplikację zanim wątek się zwolni co to za Terminaten? kiedy to coś zmieniasz?

//edit
Suspend? zawieszasz wątek a mimo to masz zaznaczone FreeOnTerminate? Ten wątek się nie zwolni sam.

1

po pierwsze cały ten wątek jest napisany w dziwny i pokręcony sposób. A po drugie jest on nie potrzebny. To samo można po prostu wcisnąć do timera.

1 użytkowników online, w tym zalogowanych: 0, gości: 1