![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему на 9910-ый проход циклом по этому коду система начинает [D6, WinXP]
kex86 © (2002-09-20 01:47:00)Есть такой код:
rgnp:=CreateRectRgn(i,j,i+1,j+1);
combinergn(rgn,rgn,rgnp,rgn_diff);
rgn уже существует и имеет достаточные размеры.
Почему на 9910-ый проход циклом по этому коду система начинает по-тихоньку виснуть и выдавать сообщения (по-очереди):
"Canvas does not allow drawing" , кажется;
"Нехватает памяти для обработки команды"
"У окна нет полос прокрутки", что вообще никак с делом не связано
Почему так, я ведь использую только 2 переменные, они постоянно обновляются, я же не загружаю память {вроде}
kex86 (2002-09-22 02:03:00) [1]да работает у меня уже, токо новые проблемы появились
cypher (2002-09-21 11:43:00) [2]Вообще, такие моменты очень легко ловятся с помощью MemProof
Карелин Артем (2002-09-20 11:35:00) [3]Все всегда надо удалять явно.
Anatoly Podgoretsky (2002-09-20 10:25:00) [4]kex86 © (20.09.02 02:17)
Ой не надо, потестируй хотя бы с полгодика
REA (2002-09-20 10:18:00) [5]Щас найду чего-нибудь из своего кода.
Ну что то вроде такого:
Function CombineRegions(Handle: HDC; L,T,R,B: Integer): HRGN;
Var Rgn: HRGN;
Begin
Result := CreateRectRgn(0,0,0,0); // Create empty region
Rgn := CreateRectRgn(L,T,R,B); // Create new region
Try
If (GetClipRgn(Handle,Result)<>1) Then // Save current region
Begin
DeleteObject(Result); // Delete old region
SelectClipRgn(Handle,Rgn); // Select new.
Result := 0; // No old region
End
Else ExtSelectClipRgn(Handle,Rgn,RGN_AND);// Combine with old
Finally
DeleteObject(Rgn); // Delete new
End;
End;
Так я и не понял - надо их удалять или нет. В MSDN явно не написано, но хуже не будет.
kex86 (2002-09-20 02:26:00) [6]хотя всё равно немного глючит
kex86 (2002-09-20 02:17:00) [7]Работает!!! ждите новую прогу в кладовке (послезавтра ночью-еще оформить надо)
Большо-о-ой пасиб
kex86 (2002-09-20 02:12:00) [8]Уже пробую
MBo (2002-09-20 02:08:00) [9]каждому CreateRectRgn должно соответствовать DeleteObject
тысячи регионов gdi не потянет, тем более, очевидно, не простых прямоугольных, что следует из combinergn
new(rgnp) здесь ни к чему, только лишний указатель хранить.
проследи дебаггером, какие значения дескрипторов в каждом цикле. Я так полагаю, что разные, а это значит, что старый дескриптор остался "висячим", ссылка на него утеряна, и до завершния процесса он будет отъедать ресурсы GDI
kex86 (2002-09-20 01:59:00) [10]1. Так они же заменяются самими собой, а виснит все до конца цикла
2. Пробовал, после цикла, не помогает
3. Пробовал даже использовать указатели: перед каждым циклом
new(rgnp), а после каждого-dispose(rgnp) - не помогает
правда я rgn не отчищал, но мне надо чтоб он сохранялся
MBo (2002-09-20 01:50:00) [11]А уничтожаешь созданные регионы?