Форум: "Основная";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
ВнизПочему на 9910-ый проход циклом по этому коду система начинает Найти похожие ветки
← →
kex86 (2002-09-20 01:47) [0]Есть такой код:
rgnp:=CreateRectRgn(i,j,i+1,j+1);
combinergn(rgn,rgn,rgnp,rgn_diff);
rgn уже существует и имеет достаточные размеры.
Почему на 9910-ый проход циклом по этому коду система начинает по-тихоньку виснуть и выдавать сообщения (по-очереди):
"Canvas does not allow drawing" , кажется;
"Нехватает памяти для обработки команды"
"У окна нет полос прокрутки", что вообще никак с делом не связано
Почему так, я ведь использую только 2 переменные, они постоянно обновляются, я же не загружаю память {вроде}
← →
MBo (2002-09-20 01:50) [1]А уничтожаешь созданные регионы?
← →
kex86 (2002-09-20 01:59) [2]1. Так они же заменяются самими собой, а виснит все до конца цикла
2. Пробовал, после цикла, не помогает
3. Пробовал даже использовать указатели: перед каждым циклом
new(rgnp), а после каждого-dispose(rgnp) - не помогает
правда я rgn не отчищал, но мне надо чтоб он сохранялся
← →
MBo (2002-09-20 02:08) [3]каждому CreateRectRgn должно соответствовать DeleteObject
тысячи регионов gdi не потянет, тем более, очевидно, не простых прямоугольных, что следует из combinergn
new(rgnp) здесь ни к чему, только лишний указатель хранить.
проследи дебаггером, какие значения дескрипторов в каждом цикле. Я так полагаю, что разные, а это значит, что старый дескриптор остался "висячим", ссылка на него утеряна, и до завершния процесса он будет отъедать ресурсы GDI
← →
kex86 (2002-09-20 02:12) [4]Уже пробую
← →
kex86 (2002-09-20 02:17) [5]Работает!!! ждите новую прогу в кладовке (послезавтра ночью-еще оформить надо)
Большо-о-ой пасиб
← →
kex86 (2002-09-20 02:26) [6]хотя всё равно немного глючит
← →
REA (2002-09-20 10:18) [7]Щас найду чего-нибудь из своего кода.
Ну что то вроде такого:
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 явно не написано, но хуже не будет.
← →
Anatoly Podgoretsky (2002-09-20 10:25) [8]kex86 © (20.09.02 02:17)
Ой не надо, потестируй хотя бы с полгодика
← →
Карелин Артем (2002-09-20 11:35) [9]Все всегда надо удалять явно.
← →
cypher (2002-09-21 11:43) [10]Вообще, такие моменты очень легко ловятся с помощью MemProof
← →
kex86 (2002-09-22 02:03) [11]да работает у меня уже, токо новые проблемы появились
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c