Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Потеря памяти / 14 сообщений из 14, страница 1 из 1
19.12.2018, 10:34
    #39749978
Riss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потеря памяти
Добрый день господа )))

Беру форму, кидаю Image,timer,headerControl и скидываю в таймере экран на image.
Переменные очищаю, но происходит постоянная потеря памяти....

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Jpeg,Activex,

  Dialogs, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    HeaderControl1: THeaderControl;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
const
  CAPTUREBLT = $40000000;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Bmp: TBitmap; // BMP ôîðìàò
  jpeg:TJpegImage;
  err:boolean;
begin
           err:=false;
           try
             Bmp:=TBitMap.Create; // ñîçäàþ îáúåêò: èçîáðàæåíèå â ôîðìàòå BMP
             jpeg := TJPEGImage.Create;
             Bmp.Height:=Image1.Height; // ïîäãîíÿþ ðàçìåðû èçîáðàæåíèÿ
             Bmp.Width:=Image1.Width;
           except
             err:=true;
             HeaderControl1.Sections[0].Text:='Error create Object Screen';
           end;
           if not(err) then
           try
             BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, screen.Height,
                    GetDC(0), 0, 0, SRCCopy or CAPTUREBLT);
             jpeg.Assign(bmp);
           except
             err:=true;
             HeaderControl1.Sections[0].Text:='error copy screen';
           end;
           if not(err) then
           try
             jpeg.CompressionQuality:=100;
             jpeg.Compress;
           except
             err:=true;
             HeaderControl1.Sections[0].Text:='error compress jpeg';
           end;

           if not(err) then
           Image1.Picture.Bitmap.Assign(jpeg);
           if not(err) then
           try
            jpeg.Free;
            bmp.Free;
           except
             err:=true;
             HeaderControl1.Sections[0].Text:='Error free';
           end;
end;

end.



Сможете подсказать каким образом избежать этого?
...
Рейтинг: 0 / 0
19.12.2018, 10:40
    #39749983
Tactical Nuclear Penguin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потеря памяти
жуть
...
Рейтинг: 0 / 0
19.12.2018, 10:43
    #39749984
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потеря памяти
RissСможете подсказать каким образом избежать этого?
Ты сам то понимаешь, что ты там написал ?

Попробуй так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Bmp: TBitmap; // BMP ôîðìàò
begin
 Bmp:=TBitmap.Create;
 try
   ...
 finally
  Bmp.Free;
 end;
end.
...
Рейтинг: 0 / 0
19.12.2018, 10:49
    #39749989
Riss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потеря памяти
Valery_B,

Не обращайте внимание на все - по сути есть так как ты написал.... Ничего не изменится - память все равно будет пропадать

Вы на газету внимания не обращайте - рыбу приходилось заворачивать
...
Рейтинг: 0 / 0
19.12.2018, 10:50
    #39749993
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потеря памяти
Код: pascal
1.
2.
if not(err) then
... .Free;


А если err? тогда кто будет память освобождать?
...
Рейтинг: 0 / 0
19.12.2018, 10:53
    #39749996
Riss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потеря памяти
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
         try
             Bmp:=TBitMap.Create; // создаю объект: изображение в формате BMP
             jpeg := TJPEGImage.Create;
             Bmp.Height:=Image1.Height; // подгоняю размеры изображения
             Bmp.Width:=Image1.Width;
             BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,
                    GetDC(0), 0, 0, SRCCopy or CAPTUREBLT);
             jpeg.Assign(bmp);
             jpeg.CompressionQuality:=100;
             jpeg.Compress;
             Image1.Picture.Bitmap.Assign(jpeg);
             jpeg.Free;
             bmp.Free;
           except
             HeaderControl1.Sections[0].Text:='Ошибка';
           end;



Если вас смущает, то пусть будет так
...
Рейтинг: 0 / 0
19.12.2018, 10:55
    #39750002
Riss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потеря памяти
RWolf,

Это будет другая тема.... Мне не понятно, где тут присходит потеря памяти?
...
Рейтинг: 0 / 0
19.12.2018, 10:56
    #39750004
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потеря памяти
Riss,

Если где-нибудь между Bmp.Create() и Bmp.Free() будет exception, то что получится?...
Вам же показали как надо делать.
...
Рейтинг: 0 / 0
19.12.2018, 10:56
    #39750005
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потеря памяти
RissЕсли вас смущает, то пусть будет так
Смущает.
После того как ты написал .Create, следующий операторы должны быть:
Код: pascal
1.
2.
3.
4.
5.
6.
.Create
 try
  ...
 finally
 .Free;
 end;


После того как ты это напишешь, начинаешь думать, что вписать между Try и Finally.
...
Рейтинг: 0 / 0
19.12.2018, 10:59
    #39750008
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потеря памяти
Вот так всё равно течёт?..
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  try
    jpeg := nil;
    Bmp:=TBitMap.Create; // создаю объект: изображение в формате BMP
    try
      jpeg := TJPEGImage.Create;
      Bmp.Height:=Image1.Height; // подгоняю размеры изображения
      Bmp.Width:=Image1.Width;
      BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,
         GetDC(0), 0, 0, SRCCopy or CAPTUREBLT);
      jpeg.Assign(bmp);
      jpeg.CompressionQuality:=100;
      jpeg.Compress;
      Image1.Picture.Bitmap.Assign(jpeg);
    finally
      jpeg.Free;
      bmp.Free;
  end;
  except
    HeaderControl1.Sections[0].Text:='Ошибка';
  end;
...
Рейтинг: 0 / 0
19.12.2018, 11:01
    #39750012
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потеря памяти
RissRWolf,

Это будет другая тема.... Мне не понятно, где тут присходит потеря памяти?

Где-то в районе BitBlt.
Чтобы оперировать хэндлами GDI, нужно их лочить и освобождать — GetDC/ReleaseDC.
Это если отвлечься от дельфовых Create/Free, я по умолчанию считаю, что эксепшенов этот код всё-таки не бросает.
...
Рейтинг: 0 / 0
19.12.2018, 11:03
    #39750013
Riss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потеря памяти
alekcvp,
К сожалению
...
Рейтинг: 0 / 0
19.12.2018, 11:04
    #39750014
Riss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потеря памяти
RWolf,

Попробую покапать - спасибо
...
Рейтинг: 0 / 0
19.12.2018, 11:59
    #39750071
Riss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Потеря памяти
RWolf,

Действительно. Прошел вариант

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  SDC: hDC; 


  ...
       SDC := GetDC(0);
       BitBlt(BMP.Canvas.Handle,
                    0,0,
                    bmp.Width, bmp.Height,
                    SDC,
                    0,0,
                    SRCCOPY);
      ReleaseDC(0, SDC);
 ...



Спасибо всем за урок )) Очень признателен ))
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Потеря памяти / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]