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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Утечка ресурса, Как ее искать? 
:(
    Опции темы
(С)нежная королёва
Дата 17.10.2003, 09:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











После того, как мой компонент много-много раз перерисуется (наверное миллион раз), меняется цвет некоторых линий, а потом и вообще все виснет. Подозреваю, утечку какого-либо графического ресурса, или возможно виновата слишком интенсивная работа с этими самыми ресурсами. В процедуре Paint вначале создаю несколько Pen-ов, Brush-ей, в конце освобождаю их. Кто знаком с темой?
  Вверх
<Spawn>
Дата 17.10.2003, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Покажи код отрисовки компонента


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
(С)
Дата 17.10.2003, 11:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код примерно такой (вычисления я в основном удалил)

procedure TMyComponent.Paint;
var
ARect: TRect;
X, Y, dX, dY, hor_width, i: integer;
s: string;
DC: HDC;
Brush, FocusedBrush, SavedBrush: HBRUSH;
SavedPen, LinesPen, ColorPen, PlPen, HorPen: HPEN;
Icon: TIcon;
SavedFont: HFONT;

procedure DrawLine(X1, Y1, X2, Y2: integer);
begin
MoveToEx(DC, X1, Y1, nil);
LineTo (DC, X2, Y2);
end;

procedure DrawIcon(Icon: TIcon; Left, Top, Width, Height: integer);
var icon2: HICON;
begin
if not Icon.Empty then
if FEnabled then
DrawIconEx(DC, Left, Top, Icon.Handle, Width, Height, 0, Brush, DI_IMAGE)
else begin
icon2:= CopyImage(Icon.Handle, IMAGE_ICON, Width, Height, LR_MONOCHROME);
DrawIconEx(DC, Left, Top, icon2, Width, Height, 0, Brush, DI_IMAGE);
DestroyIcon(icon2);
end;
end;

begin
Icon:= TIcon.Create;
DC:= Canvas.Handle;

LinesPen:= CreatePen(PS_SOLID, 0, FLinesColor);
ColorPen:= CreatePen(PS_SOLID, 0, Color);
PlPen:= CreatePen(PS_SOLID, 0, FPlusColor);
Brush:= CreateSolidBrush(Color);
FocusedBrush:= CreateSolidBrush(FFocusColor);

if FDrawHor then
HorLinesPen:= CreatePen(PS_SOLID, 0, FHorColor);

SavedBrush:= SelectObject(DC, Brush );
SavedPen:= SelectObject(DC, LinesPen );
SavedFont:= SelectObject(DC, self.Font.Handle);

SetBkColor(DC, Color);

while n <> nil do begin
if FDrawLines then begin
SelectObject(DC, LinesPen);
DrawLine(X, dY, X + dX, dY);
end;
if b then begin
SelectObject(DC, PlPen);
Rectangle(DC, ng.PlLeft, ng.PlTop, ng.PlLeft + FPlSize, ng.PlTop + FPlSize);
DrawLine(ng.PlLeft + FPlSize shr 2, dY,
ng.PlLeft + FPlSize - FPlSize shr 2, dY);
end;
if b then begin
if FImages <> nil then begin
FImages.GetIcon(n.FImageIndex, Icon);
DrawIcon(n, Icon, ng.IconLeft, ng.IconTop, FIconWidth, FIconHeight);
end;
SetTextColor(DC, n.GetFont.Color);
FillRect(DC, Rect(ng.TextLeft, ng.TextTop, ng.TextRight, ng.TextBottom), FocusedBrush);
SetBkColor(DC, FFocusColor);
SetTextColor(DC, FFocusFontColor);
DrawText(DC, PChar(s), -1, ARect, DT_WORDBREAK or DT_NOCLIP);
if n = FFocused then
SetBkColor(DC, Color);
end;
Y:= Y + n.FHeight;
if Y > Height then
break;

if FDrawHor then begin
SelectObject(DC, HorLinesPen);
DrawLine(0, Y - hor_width, Width, Y - hor_width);
end;
n:= n.Next;
end;
SelectObject(DC, SavedPen);
SelectObject(DC, SavedBrush);
if FTop <> nil then
SelectObject(DC, SavedFont);
DeleteObject(LinesPen);
DeleteObject(PlusPen);
DeleteObject(ColorPen);
DeleteObject(FocusedBrush);
if FDrawHor then
DeleteObject(HorPen);
Icon.Free;
end;
  Вверх
man2002ua
Дата 17.10.2003, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



попробуй вместо DC := Canvas.DC поставить DC := GetDC(YourComponentWindow.Handle), а в конце - ReleaseDC(DC, YourComponentWindow.Handle);
Раз уж ты везде пользуешь функции API...


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
December
Дата 17.10.2003, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


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

Репутация: 8
Всего: 57



Скорее всего, здесь виноват не код, а сама графическая векторная подсистема винды. У меня не раз было, что после множества операций с векторной графикой кончались системные ресурсы и приходилось перезагружать винды (особенно при работе с DDE). Причём не только с участием моих программ - Word этим очень грешен.


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

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

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

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

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


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

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


 




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


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

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