Создаю поток. Все ресурсы созданные в нем освобождаю, но память все равно переполняется. Не один десяток раз проходился по коду отладчиком - БЕЗРЕЗУЛЬТАТНО. Помогите найти утечку памяти. Не один день уже бьюсь с этим кодом.
Код самого потока:
Код: Выделить всё
unit uMonThread;
interface
uses
Forms,System.Classes, Windows, Messages, SysUtils, Variants, Graphics, Controls, Dialogs, ExtCtrls, StdCtrls, ComCtrls, mmsystem;
type FRes = record found: boolean; x,y: integer; end;
type
//Для сравнения изображений (чб)
pRGBLine=^TRGBLine;
TRGBLine=array[word] of RGBTriple;
TIMGData=array[word] of pRGBLine;
type
TMonDirThread = class(TThread)
private
procedure checkall();
Procedure BrowserScreen(imgW,imgH,X,Y,BlackToWhite:integer;BMP:TBitmap);
procedure Threshold(Bitmap: TBitmap; Value: Byte; Color1, Color2: TColor);
Procedure BMPFromDLL(bmp:TBitmap; ResName: string;BlackToWhite:integer);
function CompareIMG(bmp1, bmp2:TBitMap): FRes;
function ResName(Monster:string): string;
public
next, //Для остановки процесса
MonDirHello, //здороваемся
MonDirLS, //ЛС
MonDirGiExit, //Игрок покинул гильдию
MonDirInviteClose, //Отклонять приглашения в группы
MonDirExitParty, //Отряд расформирован
MonDirDied, //если умер
MonDirParalich, //контроль паралича
MonDirMorf, //контроль перевоплощения
MonDirMorfSec, //контроль перевоплощения(почти закончился)
MonDirTotem, //('тотем');
MonDirRampage, //проверка на буйство
MonDirTimeValk, //проверка на искажение времени
MonDirSpeed, //проверка на скорость
MonDirDisconnect //Дисконнект
:boolean;
nickName:string;
n:integer;
protected
procedure Execute; override;
end;
var
AModule: THandle;
maxerr:integer;
implementation
procedure TMonDirThread.BMPFromDLL(bmp: TBitmap; ResName: string;
BlackToWhite: integer);
begin
bmp.LoadFromResourceName(AModule,ResName);
if BlackToWhite<>900 then Threshold(bmp, BlackToWhite, clWhite, clBlack);
end;
function TMonDirThread.CompareIMG(bmp1, bmp2: TBitMap): FRes;
var
i,y, x, yy, xx, err: integer;
IMG1,IMG2: TIMGData;
begin
for i:=0 to bmp1.Height-1 do IMG1[i]:=bmp1.ScanLine[i];
for i:=0 to bmp2.Height-1 do IMG2[i]:=bmp2.ScanLine[i];
//основной цикл по всему изображению
y:=0;
repeat
x:=0;
repeat
//вложеный цикл по искомому фрагменту
Result.found:=true;
yy:=0;
repeat
xx:=0;
repeat
//если нужно точное соответствие достаточно проверить только одну компоненту
if maxerr=0 then begin
if IMG1[y+yy, x+xx].rgbtGreen<>IMG2[yy,xx].rgbtGreen then Result.found:=false;
//в противном случае сначала считаем ошибку (сумму абсолютных разниц)
end else begin
err:=abs(IMG1[y+yy, x+xx].rgbtBlue - IMG2[yy,xx].rgbtBlue)+
abs(IMG1[y+yy, x+xx].rgbtGreen - IMG2[yy,xx].rgbtGreen)+
abs(IMG1[y+yy, x+xx].rgbtRed - IMG2[yy,xx].rgbtRed);
//если ошибка больше допустимой, сбрасываем флаг, дальше просматривать фрагмент нету смысла
if err>maxerr then Result.found:=false;
end;
inc(xx);
until (xx>=bmp2.Width) or (Not Result.found);
inc(yy);
until (yy>=bmp2.Height) or (Not Result.found);
inc(x);
until (x>bmp1.Width-bmp2.Width) or (Result.found);
inc(y);
until (y>bmp1.Height-bmp2.Height) or (Result.found);
//если флаг установлен, значит есть результат, записываем координаты верхнего левого пиксела
if Result.found then begin
Result.x:=x-1;
Result.y:=y-1;
end;
end;
procedure TMonDirThread.BrowserScreen(imgW, imgH, X, Y, BlackToWhite: integer;
BMP: TBitmap);
var
vDesktopDC: HDC;
begin
vDesktopDC := GetWindowDC(GetDesktopWindow);
try
bmp.PixelFormat := pf24bit;
bmp.Height := imgH;
bmp.Width := imgW;
BitBlt(bmp.Canvas.Handle, 0,0,imgW,imgH,vDesktopDC,X,Y,SRCCOPY);
if BlackToWhite<>900 then Threshold(bmp,BlackToWhite,clWhite, clBlack);
finally
ReleaseDC(GetDesktopWindow, vDesktopDC);
end;
end;
procedure TMonDirThread.checkall;
var
FindResult: FRes;
s:string;
HelloChekerBMP1,HelloChekerBMP2:TBitmap;
begin
HelloChekerBMP1:=TBitmap.Create; HelloChekerBMP2:=TBitmap.Create;
//ЛС
begin
BrowserScreen(70,13,15, 644, 160, HelloChekerBMP1);
BMPFromDLL(HelloChekerBMP2,'ls',160);
FindResult:=CompareIMG(HelloChekerBMP1,HelloChekerBMP2);
if FindResult.found then MonDirLS:=true else MonDirLS:=false;
end;
HelloChekerBMP1.free; HelloChekerBMP2.free;