Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Торможение при многократном выполнении процедуры, делаю скриншоты и потом всё тормозит 
:(
    Опции темы
LamerTM
Дата 10.12.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 11.3.2006

Репутация: нет
Всего: 0



Здравствуйте.

Есть такая прога:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure RefreshScreenshot;
    { Private declarations }
  public
    { Public declarations }
    Screenshot: TImage;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
          Screenshot := TImage.Create(Application);
end;

procedure TForm1.Button1Click(Sender: TObject);
var       i: Integer;
begin
          for i := 1 to 1000 do RefreshScreenshot;
end;

procedure TForm1.RefreshScreenshot;
var       cc: TCanvas;
          Rect: TRect;
begin
          Screenshot.Canvas.Rectangle(0, Screen.Height, Screenshot.Width, Screenshot.Height);
          cc := TCanvas.Create;
          cc.Handle := GetDC(GetDesktopWindow);
          Rect.Left := 0;
          Rect.Top := 0;
          Rect.Right := Screen.Width;
          Rect.Bottom := Screen.Height;
          Screenshot.Canvas.CopyRect(Rect, cc, Rect);
          cc.Free;
end;

end.

После нажатия на кнопку, выполняется RefreshScreenshot 1000 раз после чего комп начинает притормаживать (все приложения). По диспетчеру задач не видно чтобы память была чем-то занята, но по признакам похоже что памяти не хватает. После закрытия приложения всё восстанавливается. Вчера вообще был прикол, всё так заглючило что программы не запускались (винда глюканулась).
Как сделать чтобы глюков таких не было. smile  Что не правильно?
PM MAIL   Вверх
Guedda
Дата 10.12.2006, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Это происходит потому что ты создаёшь 1000 объектов типа TImage, но не высвобождаешь память от них... 
Код

ScreenShot.Free;



--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
LamerTM
Дата 10.12.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 11.3.2006

Репутация: нет
Всего: 0



Цитата(Guedda @  10.12.2006,  15:46 Найти цитируемый пост)
Это происходит потому что ты создаёшь 1000 объектов типа TImage, но не высвобождаешь память от них... 

Я не создаю объекты TImage, я создаю TCanvas. Тот объект Screenshot: TImage создается один раз и навсегда, потом в него копируются изображения функцией CopyRect. А много раз создается объект сс: TCanvas. Но там вроде стоит в конце cc.Free. 
Сейчас закомментировал всю работу с Screenshot: TImage. Осталось только cc: TCanvas. И всё равно тормозит. Значит дело в cc: TCanvas. 

Там вроде Handle этого TCanvas теряется при присвоении cc.Handle := GetDC(GetDesktopWindow); Может в этом дело?
PM MAIL   Вверх
LamerTM
Дата 10.12.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 11.3.2006

Репутация: нет
Всего: 0



Сейчас закомментил строку 
Код

cc.Handle := GetDC(GetDesktopWindow);
 
и всё тормозить перестало, теперь объект удаляется после создания. Но скриншоты-то не делаются! Что делать не знаю.
PM MAIL   Вверх
maxim1000
Дата 10.12.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 4
Всего: 110



не знаю, освобождается ли DC в деструкторе TCanvas
(скорее всего, даже нет, т.к. у объекта нет информации, как его освобождать)
так что можно попробовать сделать ReleaseDC
в диспетчере задач есть ещё столбец "объекты GDI" (если нет, его можно включить в настройках)
там ещё не помешало бы посмотреть
а то контексты - такой же ресурс как и память...


--------------------
qqq
PM WWW   Вверх
LamerTM
Дата 10.12.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 11.3.2006

Репутация: нет
Всего: 0



Цитата(maxim1000 @  10.12.2006,  17:25 Найти цитируемый пост)
не знаю, освобождается ли DC в деструкторе TCanvas(скорее всего, даже нет, т.к. у объекта нет информации, как его освобождать)так что можно попробовать сделать ReleaseDCв диспетчере задач есть ещё столбец "объекты GDI" (если нет, его можно включить в настройках)там ещё не помешало бы посмотретьа то контексты - такой же ресурс как и память...

Всё супер! smile Диспетчер задач показывал увеличение количества объектов GDI на 1000 после каждого нажатия кнопки. Поставил вот эту строку перед освобождением TCanvas:
Код

ReleaseDC(cc.Handle, cc.Handle);

И всё заработало! Единственное, что я не уверен что эту ReleaseDC надо использовать именно с такими параметрами. Но работает вроде. Ничего не тормозит, в диспетчере задач количество объектов GDI не увеличивается. 
Спасибо! В репу дать не могу, сорри, тут у вас ограничения на количество постов.
PM MAIL   Вверх
maxim1000
Дата 10.12.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 4
Всего: 110



Цитата(LamerTM @  10.12.2006,  18:51 Найти цитируемый пост)
ReleaseDC(cc.Handle, cc.Handle);

первый параметр обычно совпадает с параметром, переданным в GetDC - т.е. дескриптор окна


--------------------
qqq
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.