Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2016, 12:51   #1
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию Зависание программы обработки курсора

Есть функция сравнения курсора с эталонным.
функция работает в таймере. Срабатывает ~10 000 раз и вылетает эксцепшин в юните Vcl.Graphiсs

First chance exception at $76ADC54F. Exception class EOutOfResources with message
'Параметр задан неверно.
'.
Process test.exe (15600)


Вопрос простой: С чем связано и как с этим быть.

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, sMemo;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    sMemo1: TsMemo;
    procedure Timer1Timer(Sender: TObject);

    function CompareCur(curName: string): boolean;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.CompareCur(curName: string): boolean;
var
  Bitmap,BitmapKursor : TBitmap;
  CI : TCursorInfo;
  F1, F2: TmemoryStream;
  IconIMG:TIcon;
begin
  IconIMG  := TIcon.Create;
  Bitmap := TBitmap.Create;
  BitmapKursor:= TBitmap.Create;
  f1:=TmemoryStream.create;
  F2:=TmemoryStream.create;

  CI.cbSize := SizeOf(CI);
  GetCursorInfo(CI);
  IconIMG.Handle:=CI.hCursor;
  Bitmap.Width := IconIMG.Width;
  Bitmap.Height := IconIMG.Height;
  BitmapKursor.Width := IconIMG.Width;
  BitmapKursor.Height := IconIMG.Height;
  BitmapKursor.LoadFromFile('BITMAP\'+curName+'.bmp');
  Bitmap.Canvas.Draw(0, 0, IconIMG);
  BitmapKursor.SaveToStream(f1);
  Bitmap.SaveToStream(f2);
  if comparemem(f1.memory, f2.memory, f1.size) then  // побайтовое сравнение всего файла
  result:=true else result:=false;
  f1.free;
  f2.free;
  IconIMG.Free;
  Bitmap.Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer1.Enabled:=false;
  if CompareCur('курсорбаф') then sMemo1.Lines.Add('1');
timer1.Enabled:=true;
end;

end.
stlcrash вне форума Ответить с цитированием
Старый 30.11.2016, 13:11   #2
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию

РЕШЕНО
Как обычно проблема в моей невнимательности
BitmapKursor:= TBitmap.Create;
но не освободил в конце функции..
stlcrash вне форума Ответить с цитированием
Старый 30.11.2016, 13:32   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

так надо же удалять все все так часто создаваемые объекты.
Цитата:
Код:
  IconIMG  := TIcon.Create;
  Bitmap := TBitmap.Create;
  BitmapKursor:= TBitmap.Create;
  f1:=TmemoryStream.create;
  F2:=TmemoryStream.create;
А еще лучше не дергать систему постоянно на их создание и постоянное чтение файла(кеширование конечно это эту временную задержку { LoadFromFile } частично снимает)

Код:
TForm1 =class
...
  procedure FormCreate(sender: TObject); // заранее один раз при старте создать все нужные объекты.
  procedure FormDestroy(sender: TObject); // а при завершении приберем за собой
private // да и нужны-то по большому счету 
  f1: TMemoryStream; // поток для хранения эталона
    (один раз его заполнили и все) 
  f2: TMemoryStream; // поток для записи тестируемого объекта
  ... // и его источники данных 
end;

procedure TForm1.Create(sender: TObject);
begin
  f1:=TMemoryStream.Create;
  ....
  
  f2:=TmemoryStream.Create;
 ....
end;

procedure Tform1.Destroy(sender: TObject);
begin
  f1.Free;
  ...
  
  f2.Free;
end;

function TForm1.CompareCur(curName: string): boolean;
var
  CI : TCursorInfo;
begin
  CI.cbSize := SizeOf(CI);
  GetCursorInfo(CI);
  IconIMG.Handle:=CI.hCursor;
  Bitmap.Canvas.Draw(0, 0, IconIMG);
  f2.position:=0;
  Bitmap.SaveToStream(f2);
  result:=comparemem(f1.memory, f2.memory, f1.size);  // побайтовое сравнение всего файла
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 30.11.2016 в 13:39.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависание программы. stlcrash Общие вопросы Delphi 13 09.06.2016 15:59
Зависание программы (Delphi7) nWizz Помощь студентам 1 29.04.2014 21:24
MFC зависание программы Kukurudza Общие вопросы C/C++ 8 17.02.2012 21:41
Зависание программы с потоком casper0094 Общие вопросы Delphi 4 25.08.2010 22:49
Зависание программы. kardinal94 Общие вопросы Delphi 2 23.08.2010 17:36