Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.03;
Скачать: CL | DM;

Вниз

Почему на 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
1-7893
Aleksey Pavlov
2002-09-19 12:21
2002.10.03
COM. Раннее связывание и ID-связывание. Есть ли реальное отличие?


1-7977
Akim2
2002-09-20 18:45
2002.10.03
Можно ли достучаться к Property класса по имени


7-8181
Tolic-F
2002-07-22 09:12
2002.10.03
CD-ROM Sony CDU5221


4-8226
Bond
2002-08-16 13:04
2002.10.03
Изменить реестр Windows, используя WinAPI


7-8204
Zergling
2002-07-23 09:32
2002.10.03
Работа с SysTray