Hallo,
ich habe ein Programm geschrieben, das IPs anpingt. Für jeden Ping wird ein Thread erstellt. Ich stelle jedoch fest, dass bei jeder Threaderstellung und Terminierung 16 kByte verloren gehen.
Ich kann jedoch nicht nachvollziehen, wo das Speicherleck ist.
Hier der Aufruf des Threads...
Delphi-Quellcode:
IpWatchList[nowIPIndex].IPThread := TMyThreads.Create(true);
IpWatchList[nowIPIndex].IPThread.InetAddress := png_IP;
IpWatchList[nowIPIndex].IPThread.TimeOut := settings.TimeOut;
IpWatchList[nowIPIndex].IPThread.Index := nowIPIndex;
IpWatchList[nowIPIndex].IPThread.Resume;
So wird der Thread dann geschlossen...
Delphi-Quellcode:
procedure TForm1.UpdateIPView(Online : Boolean; Index : Integer);
begin
//IpWatchList[Index].IPThread.FreeOnTerminate := true;
IpWatchList[Index].IPThread.Terminate;
if Online then
begin
//...
end
else
begin
//...
end;
end;
Nach Terminate wird auch Speicher freigegeben. Jedoch weniger als zuvor reserviert wurde.
Im Thread geschieht folgendes...
Delphi-Quellcode:
procedure TMyThreads.Execute;
begin
Online := Ping(InetAddress,TimeOut);
UpdateMain;
end;
function TMyThreads.Ping(IPAddress :
string; IPTimeOut : Integer) : boolean;
var
Handle : THandle;
InAddr : IPAddr;
DW : DWORD;
rep :
array[1..128]
of byte;
begin
Result := false;
Handle := IcmpCreateFile;
if Handle = INVALID_HANDLE_VALUE
then
Exit;
TranslateStringToTInAddr(InetAddress, InAddr);
DW := IcmpSendEcho(
Handle, InAddr,
nil, 0,
nil, @rep, 128, TimeOut);
Result := (DW <> 0);
IcmpCloseHandle(
Handle);
end;
procedure TMyThreads.UpdateMain;
begin
Form1.UpdateIPView(Online,
Index);
end;
Zum Pingen benutze ich die
Unit "raw_ping".
Vielen Dank schonmal für eure Hilfe
.