Форумчанин
Регистрация: 04.07.2010
Сообщений: 131
|
Что я делаю не так?
MonDirThread.MonDirTotem всегда выдает true
Не зависимо от того, что на экране.. Без потока все работало.
И во вторых, процедура checkall стала работать в потоке в несколько раз дольше, чем в основном потоке в старой версии программы.
В основном потоке:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
//поток
MonDirThread:=TMonDirThread.Create(False);
MonDirThread.FreeOnTerminate:=false;
MonDirThread.Priority:=tpNormal;
end;
procedure TForm1.sButton9Click(Sender: TObject);
begin
if MonDirThread.MonDirTotem then showmessage( 'нет тотема'+#13+InttoStr(MonDirThread.kol) ) else showmessage( 'тотема'+#13+InttoStr(MonDirThread.kol) ) ;
end;
Код потока:
Код:
unit uMonThread;
interface
uses
Forms,System.Classes, Windows, Messages, SysUtils, Variants, Graphics, Controls, Dialogs, ExtCtrls, StdCtrls, ComCtrls, mmsystem;
type FResMonDir = record found: boolean; x,y: integer; end;
type
//Для сравнения изображений (чб)
pRGBLineMonDir=^TRGBLineMonDir;
TRGBLineMonDir=array[word] of RGBTriple;
TIMGDataMonDir=array[word] of pRGBLineMonDir;
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): FResMonDir;
function ResName(Monster:string): string;
public
next:boolean; //Для остановки процесса
kol:integer;
MonDirHello, //здороваемся
MonDirLS, //ЛС
MonDirGiExit, //Игрок покинул гильдию
MonDirInviteClose, //Отклонять приглашения в группы
MonDirExitParty, //Отряд расформирован
MonDirDied, //если умер
MonDirParalich, //контроль паралича
MonDirMorf, //контроль перевоплощения
MonDirMorfSec, //контроль перевоплощения(почти закончился)
MonDirTotem, //тотем
MonDirRampage, //проверка на буйство
MonDirTimeValk, //проверка на искажение времени
MonDirSpeed, //проверка на скорость
MonDirDisconnect //Дисконнект
:boolean;
var
nick:string;
{ Private declarations }
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;
procedure TMonDirThread.BrowserScreen(imgW, imgH, X, Y, BlackToWhite: integer;
BMP: TBitmap);
var
vDesktopDC: HDC;
begin
vDesktopDC := GetWindowDC(GetDesktopWindow);
try
bmp.PixelFormat := pf24bit;
bmp.Height := Screen.Height;
bmp.Width := Screen.Width;
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;
// application.ProcessMessages;
end;
procedure TMonDirThread.checkall;
var
FindResult: FResMonDir;
s:string;
HelloChekerBMP1,HelloChekerBMP2:TBitmap;
begin
HelloChekerBMP1:=TBitmap.Create;
HelloChekerBMP2:=TBitmap.Create;
//здороваемся
begin
BrowserScreen(200,12,20, 644, 165, HelloChekerBMP1);
BMPFromDLL(HelloChekerBMP2,'hi',165);
FindResult:=CompareIMG(HelloChekerBMP1,HelloChekerBMP2);
if FindResult.found then
begin
BrowserScreen(200,12,20, 644, 250, HelloChekerBMP1);
BMPFromDLL(HelloChekerBMP2,ResName(nick),250);
FindResult:=CompareIMG(HelloChekerBMP1,HelloChekerBMP2);
if not FindResult.found then MonDirHello:=true else MonDirHello:=false;
end;
end;
//ЛС
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;
//Игрок покинул гильдию
begin
BrowserScreen(160,10,650, 410, 250, HelloChekerBMP1);
BMPFromDLL(HelloChekerBMP2,'gildia',250);
FindResult:=CompareIMG(HelloChekerBMP1,HelloChekerBMP2);
if FindResult.found then MonDirGiExit:=true else MonDirGiExit:=false;
end;
//Отклонять приглашения в группы
begin
BrowserScreen(160,10,630, 360, 250, HelloChekerBMP1);
BMPFromDLL(HelloChekerBMP2,'InviteClose',250);
FindResult:=CompareIMG(HelloChekerBMP1,HelloChekerBMP2);
if FindResult.found then MonDirInviteClose:=true else MonDirInviteClose:=false;
end;
//Отряд расформирован
begin
BrowserScreen(110,15,585, 365, 250, HelloChekerBMP1);
BMPFromDLL(HelloChekerBMP2,'group',250);
FindResult:=CompareIMG(HelloChekerBMP1,HelloChekerBMP2);
if FindResult.found then MonDirExitParty:=true else MonDirExitParty:=false;
end;
//если умер
begin
BrowserScreen(40,10,540, 340, 250, HelloChekerBMP1);
BMPFromDLL(HelloChekerBMP2,'died',250);
FindResult:=CompareIMG(HelloChekerBMP1,HelloChekerBMP2);
if FindResult.found then MonDirDied:=true else MonDirDied:=false;
end;
//контроль паралича
begin
BrowserScreen(303,35,970, 60, 120, HelloChekerBMP1);
BMPFromDLL(HelloChekerBMP2,'paralich',120);
FindResult:=CompareIMG(HelloChekerBMP1,HelloChekerBMP2);
if FindResult.found then MonDirParalich:=true else MonDirParalich:=false;
end;
//контроль перевоплощения
begin
BrowserScreen(600,32,676, 12, 200, HelloChekerBMP1);
BMPFromDLL(HelloChekerBMP2,'voplot',200);
FindResult:=CompareIMG(HelloChekerBMP1,HelloChekerBMP2);
if not FindResult.found then MonDirMorf:=false else begin
MonDirMorf:=true;
BrowserScreen(50,10,676+FindResult.x-12, 12+FindResult.y+35, 250, HelloChekerBMP1);
BMPFromDLL(HelloChekerBMP2,'voplottime',250);
FindResult:=CompareIMG(HelloChekerBMP1,HelloChekerBMP2);
if FindResult.found then MonDirMorfSec:=true else MonDirMorfSec:=false;
end;
end;
|