Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить доступ к FMemory TMemoryStream?


Aleksandr. ©   (2004-12-03 12:57:00) 

Для уменьшения фрагментации памяти я сделал финт ушами - каждый дергающий MemoryStreamы поток сразу резервирует участок памяти, и все Streamы разворачивает в ней. Для этого просто сделал потомка от TMemoryStream, который не выделяет для своего FMemory новые блоки, а юзает переданный в констракторе указатель. Но оказалась проблема - потомка пришлось рисовать в Classes, так как, несмотря на виртуальность метода ReAlloc, свойство Memory только на чтение. Соответственно, после этого изменения некоторые dcu стали требовать перекомпиляции. Пришлось энтого потомка выносить из Classes, но тогда становится недоступным FMemory. Как с ним можно работать, чтобы не менять Classes?


Aleksandr.   (2004-12-03 14:27:00) [1]

Verg ©  :
Да, знаете, так и пришлось поступить. Правда, TStream не нужен, достуточно объявить TCustomPointeredMemoryStream его потомком.


Verg   (2004-12-03 14:18:00) [2]

Ну так на пять минут работы: Скопируй из Classes исходники классов TStream, TCustomMemoryStream, TMemoryStream в свой модуль, переименуй их всех и измени в соответствии со своими нуждами.


Aleksandr.   (2004-12-03 14:09:00) [3]

Digitman © :

Слабо мне такое. Это вопрос долгого времени и многих ошибок, а работа у меня - не вольный поиск решений.


Digitman   (2004-12-03 14:04:00) [4]


> Aleksandr.   (03.12.04 13:51) [4]


а не проще ли реализовать собственный менеджер ?


Aleksandr.   (2004-12-03 13:51:00) [5]

TUser © :

Увы, винда о таких вещах не заботится абсолютно. И менеджер Борланда, хотя и лучше мелкософтного, но тоже этим не занимается. Проблема не зависит от закрытия/незакрытия потока. Она зависит от функций GetMem, AllocMem-ReAllocMem.


TUser   (2004-12-03 13:39:00) [6]

Боюсь сморозить чепуху - не, кажется, о таких вещах должен заботиться windows. В крайнем случае - Борландовский менеждер памяти. В случае TmemoryStream использованы стандартные средства оп. системы - вот пусть система и заботится о том, как уменьшить фрагментацию.

Кстати - может не закрывать потоки, а испольовать один и тот же MemoryStream - просить под него памяти все больше и больше. Тогда и проблемы не возникнет.


Aleksandr.   (2004-12-03 13:27:00) [7]

TUser © :

Фрагментацию это действительно уменьшает - мелкие всякие объекты не разрезают освобождаемые блоки на части собой, работая за пределами резервированных диапазонов - проверил на тестовой проге.
Суть фрагментации в том, что в каждом цикле поток загружает MemoryStream и дописывает или вставляет в нем что-то, то есть каждый раз под стрим берется немного больший блок памяти, чем в прошлый раз. Соответственно, в предыдущий взятый и освобожденный участок в следующем цикле он уже не влезает и выбирает у операционки новый участок, я смотрел по FreeBig. Так и получается, что через некоторое время у проги огромное количество маленьких свободных участков и ноль доступной памяти в системе.


TUser   (2004-12-03 13:14:00) [8]

А это действительно уменьшит фрагментацию? Кстати, что такое фрагментация в данном случае?


Наверх

Титульная страница Поиск, карта сайта Написать письмо