powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / GlobalNameSpace в однопоточном приложении
21 сообщений из 21, страница 1 из 1
GlobalNameSpace в однопоточном приложении
    #32221867
koff4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предыстория. В ходе написания различных проектов я уже давно столкнулся с нехваткой систеных ресурсов(GDI&USER) в Win95/98. Сперва помогало создание форм по требованию (if Form=nil then Application.CreateForm...). Потом пришлось ненужные формы уничтожать по таймеру. В процессе обрушения частенько съезжала память с сответствующим Access Violation.
И вот как-то бродил я по дельфийским исходникам и обнаружил в ключевых методах TObject (Create Destroy Read...) конструкцию вида:

GlobalNameSpace.BeginWrite;
try
...что-то серьезное
finally
GlobalNameSpace.EndWrite;
end

Вставил эту конструкцию в свои процедуры обрушения - ошибок стало гораздо меньше (ну так скажем ошибок с памятью). Опять посмотрел исходники.
В Clsses GlobalNameSpace описан как TMultiReadExclusiveWriteSynchronizer. Вроде это синхронизатор для доступа нескольких потоков к общим ресурсам.

Но у меня то один поток (таймер, насколько я помню, работает в основном потоке приложения). Как это могло повлиять на работу однопоточного приложения ???

Может у кого есть мысли по этому поводу!!!
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32221882
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
предъыстория:
в ходе написания различных проектов я ни разу не сталкивался с проблемой нехватки каких-либо ресурсов. в том числе в вин95/98. все твои пляски с закрытием форм по таймеру наводят меня на мысли о твоей неосведомленнойсти в определенных областях. хотя судя по твоему уверенному обращению с "дельфийскими исходниками" это возможно и не так. в общем, то что ты написал, не поможет мне помочь решить твою проблему.
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32221922
Фотография Alexey Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
Form.OnClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:= caFree
end;


И, разумеется, это форма не должна создаваться автоматически. И не надо проверять Form = nil, поскольку после первого закрытия будет ложным, но память освободится.
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222126
koff4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Alexey Popov: (if Form=nil then Application.CreateForm...). - это для примера. А сама идея освобождать формы сразу после закрытия... На инициализацию формы всегда затрачивается какое-то время, какое-то время на открытие DataSet-ов, какое-то на позиционирование на нужную запись. Вдобавок формы у меня вставлены в TabSheet-ы. И субъективно, если задержка при открытии формы воспринимается нормально, то долгое переключение между Tab-ами слегка раздражжает.

Так что выгоднее по возможности держать форму "в боевой готовности". Кстати, для экономии GDI-ресурсов можно по закрытии уничтожать ее Handle. Приблизительно так:

type
TWinControlHack = class(TWinControl);

Form.OnClose(Sender: TObject; var Action: TCloseAction);
var
wh: TWinControlHack;
begin
if f = nil then exit;
wh := TWinControlHack(f);
wh.DestroyHandle;
end;

...и 80% ресурсов освобождены. А при следующем открытии Handle пересоздастся.


To alex_k: Я рад что вы не сталкивались с проблемами недостатка ресурсов. Очевидно вам не приходлось писать достаточно сложных приложений.
Элементарный подсчет: В приложении 50 форм. Каждая форма отжирает от 1%(простенькие формы) до 7%(например объединенная табированная форма для справочников) от GDI. Под запущенной Delphi остается 30-35%. Как разместить все формы в памяти??? Уничтожать сразу почле использования??? Об этом я уже высказывался выше...
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222145
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ни один человек не в состоянии смотреть 50 форм одновременно.
или ты для китайцев проекты делаешь? там 50 китайцев будут пялится на огромный монитор :-)

я не монимаю этого стремления к производству все новых и новых форм. имо 5-10 унифицированных форм за глаза для самого супер крутого проекта.
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222183
Speaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO, alex_k совершенно прав. Держать в автокриейте 50 форм
неразумно, тогда действительно никаких ресурсов не хватит, особенно
если слегка увеличить их количество :)

У меня в проекте 95 форм, автоматически при запуске создается только
несколько вспомогательных, типа окна About, и то мне было просто лень
писать ручной запуск. Все остальное - по требованию.
Даже на K6-2 300 со 128Мб тормозит не больше, чем сам компьютер :)

Я бы на твоем месте оставил если это необходимо, несколько наиболее
важных форм постоянно созданными и с открытыми датасетами,
остальное - создавать по требованию.
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222189
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В приложении 50 форм. Каждая форма отжирает от 1%(простенькие ....

50 одновременно открытых форм? Которые висят в памяти? Хорошее приложение... :)
Похоже, что вы любите сами создавать себе трудности, чтобы потом из них выбираться...
Не зная вашего кода, подозреваю, что уменьшение кол-ва ошибок после использования GlobalNameSpace - просто случайное совпадение. А вообще, частенько получая AV, надо разбираться в первопричинах - из-за чего он возникает, а не хакать все подряд.
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222225
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Да уж... бывает...
А вот интересно, koff4, что бы ты делал, если бы в проекте было бы 200 форм???

А у меня поболее будет. И ничего - никаких нехваток ресурсов не наблюдается. Мало того, что они не в автокриэйте, так 90% их - в dll-ках сидят. Нужна она юзверю - создаю, не нужна - убиваю (и dll выгружаю).
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222441
koff4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, что-то ушли мы далеко в сторону от GlobalNameSpace. Хотя поднятая тема стратегии создания/разрушения форм похоже всех заинтересовала. Ну тогда:

Все согласны, что формы надо создавать "по требованию". Я так и делаю.
И в первых строках топика писал "Сперва помогало создание форм ПО ТРЕБОВАНИЮ". Ну дык и сейчас они создаются по требованию. И висят они одновременно на экране, а в памяти, занимая ресурсы системы. А вот по поводу обрушения мнения разделились.

Коротко о приложении, котрым я занимаюсь. Имеется главная форма с табами. В табах размещается гридовые формы. Что-то вроде "Продавцы", "Покупатели","Сделки с покупателями","Сделки с продавцами", "Оплаты", "Покупки". Из гридовой фрмы можно попасть в детальную. Оттуда могут быть вызваны формы для выбора из справочников.
Кроме того у гридовых форм имеются панели просмотра (например "Сделки с покупателем", "оплаты от продавца") из которых мы также можем попасть в соответствующие детальные формы. То есть это по сути дела несколько приложений под одной крышей.
Во время работы могут вызваться Word, Excel и другие внешние приложения.

Что получится если:
1. Не рушить формы вообще. Облячно уже на втором табе после запуска ресурсы заканчиваются.
2. Освобождать формы сразу же после закрытия. По этому поводу я уже говорил - каждая открытие формы будет сопровождаться определенной задержкой. И если мы напрмер ходим по гриду и открываем запись в детальной форме - задержка. Хотим открыть для выбора форму справочник товаров - задержка. Спраовочник клиентов - задержка. А если человек ходит толко в рамках скажем по оплатам - платежки вколачивает.
3. Рушить формы при недостатке ресурсов. Тогда образуется пул открытых форм. Если человек не прыгает с формы на форму, либо имеет в наличии достаточно ресурсов (или у него вообще XP) - все формы висят в памяти и моментально открываются. Если наступает напряг с ресурсами (по многим формам прыгали или Word например запустили или фотошоп)- формы, которые давно не использовались - выгружаются. Может быть они уже и не понадобятся больше. Ну а если понадобятся - ну будут некоторые тормоза. Но работать все равно будет. А как только дефецит ресурсов прошел - все опять начинает быстро шуршать.

...И все это работает. Программа может функционировать на 8% GDI, и при этом совершенно нормально работает. Вдобавок, если ни одна из форм не использует соответствующий DataSet - он закрывается. За счет этого оптимизируется производительность системы.

Если кто-то писал похожие системы было бы интересно узнать, как были решены вышеописанные проблемы
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222483
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что будет, если ты на эти табы свои контролы поместишь а не формы?

при чем здесь формы, не пойму.
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222509
Speaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>И висят они одновременно на экране, а в памяти, занимая ресурсы системы
Не совсем понятна фраза. Если имелось в виду "... не на экране, а в памяти...",
то это не создание по требованию и смысла в этом нет. Нужно делать как сказал Alexey Popov.

>Имеется главная форма с табами. В табах размещается гридовые формы.
Это все классно, но только если человеку нужно работать например только
с поставщиками, ему придется подождать, пока не откроются все остальные
формы, закладки и датасеты? IMHO, не очень разумно.

Как сделано у меня. Ситуация аналогичная (в смысле цели и задач).
Есть "Поставщики", "Покупатели", "Договоры", "Сделки" и т.д.
При запуске можно указать, какая форма покажется первой.
Формы создаются по требованию и разрушаются по закрытию.
Если ты открыл окно и не закрыл его - оно висит на панели задач,
"жрет ресурсы". Сколько окон на экране - столько форм создано.
Надоело - закрыл. Параллельно можно работать с несколькими формами.
Всякие вспомогательные окошки и просмотры, типа "Сделки за период",
"История продаж" сделаны по контекстному меню.
И Word & Excel тоже используются, но они вынесены в DLL.
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222638
Дмитрий Мыльников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня тоже во многих проектах большое количество форм, и я уже давно перешёл на создание форм по требованию. Но, при этом часто используемые формы обычно создаются в начале и всегда "висят в памяти".

Что касается описываемого случая, то я бы сделал следующее.
Предложенный способ с caFree судя по описанию задачи не разработчику не подходит. Да и в предложенном способе сложно сказать а нужно ли создавать какую-то форму или нет. А вдруг это какой-то справочник, который уже открыт из другого окна?
Я обычно всегда использую присвоение указателя NIL переменной формы после её уинчтожения. Тогда узнать создавать ли форму перед её вызовом очень просто - пишем

if not assigned(Form1) then Form1:=TForm1.Create(Application);

или через Aplication.CreatForm, это уж кому что больше подходит.

При уничтожении формы получается связка

Form1.Free; Form1:=NIL;

ну и на всякий случай в строке объявления в модуле формы добавляем

var
Form1:TForm1 = NIL;

хотя, вроде как начиная с некоторых версий это делается автоматически, но я не проверял.

Далее, когда запускается таймер на "обрушение форм", то желательно бы сделать что-то типа счётчика, который хранит количество обращений к данной форме за последний цикл таймера. Тогда можно обрушать все формы, у которых это значение ниже определенной величины (либо заданное количество форм с наименьшим значением), а у всех остальных отниамть по единичке. Соответственно, в обработке метода OnActivate или OnShow добавить прибавление единички к этой переменной. Кстати, мне кажется, что для этих целей лучше всего подходит уже существующее поле Tag:integer, которое Borland завела специально для нужд разработчиков.

Естественно, что интервал таймера должен быть достаточно большим, чтобы всё это корректно работало. Можно ещё перед "обрушением" проверять сколько системных ресурсов задействовано, а то может и не стоит "обрушение" делать.

Что каксается многопоточности. Это Вам только кажется, что у Вас один поток. На самом деле обработки потоков сообщений RTL сама запускает новые потоки, плюс я экспериментально в своё время выяснил, что событие OnPaint формы тоже приходит в отдельном потоке. Причём очень возможно, что он создаётся даже не самой программой, а Windows. Очень может быть, что и для обработки сообщения от таймера автоматически создаётся новый поток, как и с OnPaint (опять же, нужно смотерть исходники). Так что использование приведенноё Вами конструкции с BeginWrite и EndWrite вполне уместно.
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222709
koff4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Speacer: Действительно формы висят в памяти (опечатка вышла) и создаются по требованию. Вначале создается толко форма для открытого таба (запоминается при выходе). И как я уже говорил формы управляют активностью DataSet-ов, так что открывается самый минимум.

При переходе на новый таб по требованию создается новая форма, а после этого при необходимости освобождается форма старого таба. Точно также с детальками - надо создалась, не хватает ресурсов - освобождаются. И разумеется человек не ждет, пока загрузятся все формы.
Многоформенное приложение вообще конечно неплохо. И ненавязчиво решается проблема по закрытию форм - болше 4 форм в трее чисто психологически засавляют типичного пользователя чувствовать себя неуютно и закрывать ненужные окна. Хотя, если вдруг пользователь все таки откроет штук 10 окон - могут возникнуть проблемы с ресурсами.
В таком случае можно перед созданием формы контролировать свободные System-ресурсы и выдавать предупреждение вроде "Закройте неиспользуемые программы".

Но мне как то не по душе многоформенность. Я уже давно пишу приложения с использованием табов в основных формах. И народу нравится. Просто раньше в них были обычные панели с контролами. Приложения все усложнялись и усложнялись и в один прекрасный момент для них перестало хватать ресурсов (если загружать табированную форму целиком). Пришлось вставлять в табы формы ну а дальше я уже рассказывал...

to alex_k. По поводу форм в табах(в любом TWinControl) можно посмотреть например MergeForm из RXLIB.
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222757
Speaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 koff4
Ну хрен знает, мне кажется пока ты не откажешься от размещения
пол-программы на одной форме, проблемы не решатся...
Суть в том, что если в главной форме человек откроет _все_
закладки, то у тебя будет создано туева хуча форм, которые
пожрут:) ресурсы, вариант с таймером - на мой взгляд изврат,
а как по другому сделать освобождение я не представляю.
Проблема даже не в том, что формы в табах, а в том, что их
слишком много и они слишком сложные, IMHO.

У меня табы используются только в модальных формах свойств (как в виндах).
Их количество никогда не превышает 5.

Я все таки не понял, что это означает:
Действительно формы висят в памяти (опечатка вышла)
и создаются по требованию

по моему одно противоречит другому. По моим понятиям, "висят в памяти"
означает, что они созданы, но невидимы, то бишь жрут ресурсы.
По требованию, это как описал Дмитрий Мыльников.
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222773
Фотография Alexey Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае я предпочел бы создать MDI приложение и дать пользователю самому решать какие формы ему нужны.
Скорость создания формы в основном определяется БД (скорость исполнения запросов), если это не P100 16MB :-).
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222783
koff4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Дмитрий Мыльников:
Ну наконец-то дождался ответа на вопрос по сабжу. Надо же - по всем признакам однопоточное приложение оказывается многопоточным. Большое спасибо!!!
По поводу соображений по освобождению - полностью согласен. У меня всем этим рулит специальный класс-менеджер.
При создании форма в нем регистрируется.
При активизации формы происходит Lock в менеджере, чтобы случайно не освободить используемую форму. При закрытии происходит Unlock и начинается отсчет времени жизни формы. Опционально может быть уничтожен Handle формы.
Каждая форма обладает квотой в процентах, которые нужны ей для нормального создания (у меня для мелких форм - 4%, для больших - 10%). Перед созданием у менеджера запрашивается необходимое количество ресурсов и если что, рушатся формы в порядке времени бездействия.
Кроме того по таймеру(раз в 0.5 секунд) происходит контроль так называемой "черной метки" (у меня 3%). Если она достигнута (например запустили какой нибудь фотошоп, хотя непонятные провалы ресурсов наблюдаются довольно часто) опять же освобождается до необходимого значения (10%) GDI - память.
При освобождении менеджер устанавливает в nil переменную формы (задается при регистрации). Дополнительно производится контроль "левых" форм. Обычно это недосозданные при Create формы. У они либо не преобразуются в TForm, либо в них ComponetCount = 0 или наоборот ComponentCount > 1000. Такие формы также обнуляются.

Еще раз большое спасибо!!!
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222796
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Дмитрий Мыльников
RTL сама запускает новые потоки,
Все верно, но сам koff4 -то использует только один поток. Поэтому я и не понимаю, чем ему может помочь BeginWrite/EndWrite.

2 koff4
...чисто психологически засавляют типичного пользователя чувствовать себя неуютно и закрывать ненужные окна. Хотя, если вдруг пользователь все таки откроет штук 10 окон - могут возникнуть проблемы с ресурсами.
В таком случае можно перед созданием формы контролировать свободные System-ресурсы и выдавать предупреждение вроде "Закройте неиспользуемые программы".

Абослютно неверное утверждение! Почитайте статьи по проектированию интерфейсов, юзабилити. Не надо напрягать пользователя проблемами программы! Ему - пользователю - нет никакого дела, до того есть свободные ресурсы, нет их (вы еще заставьте его байты считать перед открытием окна - типа влезет или нет), у него своя работа. Т.е., для пользователя все это должно проходить незаметно.

Далее, между быстро, но с Acess Violation или медленно, но без ошибок, я бы выбрал второй вариант.
Если касаться же вашего случая - во-первых, неплохо было бы определить, почему именно медленно открывается форма. Что там тормозит? Само создание даже довольно сложно формы обычно происходит быстро. Задержки могут быть при открытии запросов, при переключении MDIChild в модальное и пр.
во-вторых, если уж писать свой пул форм, то я это вижу так:
- список всех загруженных, но не активных форм
- статистика вызовов к форме
- определение свободной памяти в системе
- если меньше некого порога, то ее выгр. наименее вызываемую
и все делать как раз в отдельном потоке.
Но овчинка выделки не стоит.
Гораздо проще и выигрышнее, напр. просто закэшировать наиболее часто используемые справочники и списки и не дергать сервер.
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222806
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, вдогонку.
На самом деле определить количество свободной памяти в Windows не так просто. Дело в том, что MS после закрытия приложений не сразу возвращает осводившуюся память, а держит ее как некий пул - на тот случай, если юзер, захочет обратно вернутся. Очень наглядно видно, если Ворд открыть-закрыть-открыть.
Они там, тоже как koff4, все что-то считают, освобождают, резервируют :)
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32222852
koff4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to aaq: Я имел ввиду ресусы GDI-сегмента который в Win98 равен 64K. Посмотреть на его текущий размер можно запустив в русской винде Стандартные-Служебные-Индикатор ресурсов. Для определения оставшейся памяти из программы приходится с некоторыми извращениями вызывать недокуменитированную функцию GetFreeSystemResources из User.exe. Когда ресурсы заканчиваются то:
1. При загруске ресурсов форм ывдается сообщение "Параметр задан неверно" и формы остается в проиежуточном кривом состоянии.
2.Выдается стопка сообщений "Canvas dos not allow drawing".
3. После чего все виснет наглухо - помогает только Ctrl-Alt-Del или вообще аппаратный Reset.

А по поводу "не сразу возвращает осводившуюся память" - ресурсы GDI освобождаются мгновенно - проверено. Кстати, сами майкрософтовские приложения (Word в частности) используют ресурсы GDI крайне незначительно. Очевидно в основном используется глобальная память системы. Ай молодцы!!!
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32223051
Дмитрий Мыльников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, как сэкономить системные ресурсы.
Начнём стого, что не все компоненты эти самые ресурсы потребляют. Часть компонентов не имеет собственного дескриптора окна, а использует дескриптор окна хозяина, куда он вставлен. Например те же TLabel или TBevel.
То есть, первый шаг - сократить до минимума используемые элементы оформления и разбивки типа TPanel, TGroup и т.п. и вместо них, если нужно красивости, испоьзовать TBevel.

Далее, Вы обмолвились о том, что у вас DataSet'ы лежат на формах, я правильно понял? Мне кажется, что это не правильный подход. DataSet сам по себе системных ресурсов GDI не потребляет, поскольку является невизуальным компонентом. То есть, я бы все DataSet'ы из форм перенёс в соотвествующие дата-модули. Их, в общем-то, для этого и придумали. Тогда время на создание форм резко сократится. По крайней мере я сам стараюсь всегда DataSet'ы держать в отдульных дата-модулях. Если всё правильно написать, то можно их потом использовать в разных программах практически не переписывая код.

aaq
Да, koff4 использует один поток. Но если в тот момент, когда он начал сносить свои формы в системе произойдет переключение процессов в Windows, а для этого там специальный таймер есть, то она вполне может забрав управление запустить новый поток для обработки сообщений, из которого вызвать оконную функцию для формы, у которой уже начат, но не закончен процесс уничтожения. В этом случае всё накрывается медным тазом. :)
Кстати, главное, что делают BeginWrite и EndWrite - блокируют и вновь разрешают переключение процессов/потоков в системе.

Что касается использования ресурсов GDI Word'm, то он их потому практически и не использует, что там в основном ТОЛЬКО ОДНО ОКНО. А всё, что вы видите на экране отображается и обрабатывается ручками через один единственный дескриптор окна. Плюс к тому же, насколько я понимаю, они очень строго придурживаются правила: "создал, поиспользовал, сразу удалил" для всех кистей, перьев и шрифтов. А вот у Borland стратегия другая. В модуле Graphics есть такая вещь, как пул используемых кистей, шрифтов, перьев и других ресурсов GDI. При этом когда идёт прорисовка через Canvas, то сначала ищется подходящий ресурс в этом самом пуле, а если его нет, то он создаётся и там сохраняется на какое-то время. Отсюда вытекает ещё один способ экономии ресурсов GDI - сведение к минимуму используемых в приложении вариантов оформления. Один, два, максимум три шрифта, один-два цвета шрифтов и т.п. То есть, программа не должна выглядеть как взбесившийся светофор или новогодняя ёлка. Да и имхо это более правильно с точки зрения правильного проектирования интерфейса пользователя. У него не должно рябить в глазах. :)

Кстати, надо будет на досуге поковырять исходники модуля Graphics. Возможно, что там можно как-то изменять количество хранимых в пуле ресурсов GDI.

А то, что периодически ресурсы сьедаются полностью говорит скорее о том, что всё-таки процесс создания/удаления форм происходит не всегда корректно и бывают случаи, когда новая форма создаётся поверх уже существующей. Тогда использованные этой формой ресурсы будут намертво заблокированны до выхода из программы.
...
Рейтинг: 0 / 0
GlobalNameSpace в однопоточном приложении
    #32224044
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Дмитрий Мыльников:
Вы подняли очень интересный (для меня) вопрос.
Во-первых - про экономию ресурсов - а как определить вообще сколько памяти занимает тот или иной компонент на форме? Сколько памяти будет отжирать форма при создании? То что TBevel более экономит ресурсы это я знаю, но на сколько?

И второе - да, GDI TDataModule не потребляют. Но, как я понимаю, в этом случае все DataSet создаются сразу - память задачи пожирают также сразу. Если же они лежат на форме, то создаются тогда. когда создается форма, - по мере необходимости. Т.е., теоретически, выигрыш в скорости создания формы будет получен за счет замедления в запуска пр-мы (или когда содается ДатаМодуль?) и опять проигрываем в потреблении ресурсов.
Для меня этот подход еще удобнее и тем, что легче найти соотв. датасет к форме.
Прав ли я?
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / GlobalNameSpace в однопоточном приложении
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]