Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
Предыстория. В ходе написания различных проектов я уже давно столкнулся с нехваткой систеных ресурсов(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. Вроде это синхронизатор для доступа нескольких потоков к общим ресурсам. Но у меня то один поток (таймер, насколько я помню, работает в основном потоке приложения). Как это могло повлиять на работу однопоточного приложения ??? Может у кого есть мысли по этому поводу!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 10:54 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
предъыстория: в ходе написания различных проектов я ни разу не сталкивался с проблемой нехватки каких-либо ресурсов. в том числе в вин95/98. все твои пляски с закрытием форм по таймеру наводят меня на мысли о твоей неосведомленнойсти в определенных областях. хотя судя по твоему уверенному обращению с "дельфийскими исходниками" это возможно и не так. в общем, то что ты написал, не поможет мне помочь решить твою проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 11:04 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. И, разумеется, это форма не должна создаваться автоматически. И не надо проверять Form = nil, поскольку после первого закрытия будет ложным, но память освободится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 11:23 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
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%. Как разместить все формы в памяти??? Уничтожать сразу почле использования??? Об этом я уже высказывался выше... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 12:43 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
ни один человек не в состоянии смотреть 50 форм одновременно. или ты для китайцев проекты делаешь? там 50 китайцев будут пялится на огромный монитор :-) я не монимаю этого стремления к производству все новых и новых форм. имо 5-10 унифицированных форм за глаза для самого супер крутого проекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 12:54 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
IMHO, alex_k совершенно прав. Держать в автокриейте 50 форм неразумно, тогда действительно никаких ресурсов не хватит, особенно если слегка увеличить их количество :) У меня в проекте 95 форм, автоматически при запуске создается только несколько вспомогательных, типа окна About, и то мне было просто лень писать ручной запуск. Все остальное - по требованию. Даже на K6-2 300 со 128Мб тормозит не больше, чем сам компьютер :) Я бы на твоем месте оставил если это необходимо, несколько наиболее важных форм постоянно созданными и с открытыми датасетами, остальное - создавать по требованию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 13:03 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
В приложении 50 форм. Каждая форма отжирает от 1%(простенькие .... 50 одновременно открытых форм? Которые висят в памяти? Хорошее приложение... :) Похоже, что вы любите сами создавать себе трудности, чтобы потом из них выбираться... Не зная вашего кода, подозреваю, что уменьшение кол-ва ошибок после использования GlobalNameSpace - просто случайное совпадение. А вообще, частенько получая AV, надо разбираться в первопричинах - из-за чего он возникает, а не хакать все подряд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 13:05 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
Да уж... бывает... А вот интересно, koff4, что бы ты делал, если бы в проекте было бы 200 форм??? А у меня поболее будет. И ничего - никаких нехваток ресурсов не наблюдается. Мало того, что они не в автокриэйте, так 90% их - в dll-ках сидят. Нужна она юзверю - создаю, не нужна - убиваю (и dll выгружаю). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 13:19 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
Да, что-то ушли мы далеко в сторону от GlobalNameSpace. Хотя поднятая тема стратегии создания/разрушения форм похоже всех заинтересовала. Ну тогда: Все согласны, что формы надо создавать "по требованию". Я так и делаю. И в первых строках топика писал "Сперва помогало создание форм ПО ТРЕБОВАНИЮ". Ну дык и сейчас они создаются по требованию. И висят они одновременно на экране, а в памяти, занимая ресурсы системы. А вот по поводу обрушения мнения разделились. Коротко о приложении, котрым я занимаюсь. Имеется главная форма с табами. В табах размещается гридовые формы. Что-то вроде "Продавцы", "Покупатели","Сделки с покупателями","Сделки с продавцами", "Оплаты", "Покупки". Из гридовой фрмы можно попасть в детальную. Оттуда могут быть вызваны формы для выбора из справочников. Кроме того у гридовых форм имеются панели просмотра (например "Сделки с покупателем", "оплаты от продавца") из которых мы также можем попасть в соответствующие детальные формы. То есть это по сути дела несколько приложений под одной крышей. Во время работы могут вызваться Word, Excel и другие внешние приложения. Что получится если: 1. Не рушить формы вообще. Облячно уже на втором табе после запуска ресурсы заканчиваются. 2. Освобождать формы сразу же после закрытия. По этому поводу я уже говорил - каждая открытие формы будет сопровождаться определенной задержкой. И если мы напрмер ходим по гриду и открываем запись в детальной форме - задержка. Хотим открыть для выбора форму справочник товаров - задержка. Спраовочник клиентов - задержка. А если человек ходит толко в рамках скажем по оплатам - платежки вколачивает. 3. Рушить формы при недостатке ресурсов. Тогда образуется пул открытых форм. Если человек не прыгает с формы на форму, либо имеет в наличии достаточно ресурсов (или у него вообще XP) - все формы висят в памяти и моментально открываются. Если наступает напряг с ресурсами (по многим формам прыгали или Word например запустили или фотошоп)- формы, которые давно не использовались - выгружаются. Может быть они уже и не понадобятся больше. Ну а если понадобятся - ну будут некоторые тормоза. Но работать все равно будет. А как только дефецит ресурсов прошел - все опять начинает быстро шуршать. ...И все это работает. Программа может функционировать на 8% GDI, и при этом совершенно нормально работает. Вдобавок, если ни одна из форм не использует соответствующий DataSet - он закрывается. За счет этого оптимизируется производительность системы. Если кто-то писал похожие системы было бы интересно узнать, как были решены вышеописанные проблемы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 15:05 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
А что будет, если ты на эти табы свои контролы поместишь а не формы? при чем здесь формы, не пойму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 15:29 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
>И висят они одновременно на экране, а в памяти, занимая ресурсы системы Не совсем понятна фраза. Если имелось в виду "... не на экране, а в памяти...", то это не создание по требованию и смысла в этом нет. Нужно делать как сказал Alexey Popov. >Имеется главная форма с табами. В табах размещается гридовые формы. Это все классно, но только если человеку нужно работать например только с поставщиками, ему придется подождать, пока не откроются все остальные формы, закладки и датасеты? IMHO, не очень разумно. Как сделано у меня. Ситуация аналогичная (в смысле цели и задач). Есть "Поставщики", "Покупатели", "Договоры", "Сделки" и т.д. При запуске можно указать, какая форма покажется первой. Формы создаются по требованию и разрушаются по закрытию. Если ты открыл окно и не закрыл его - оно висит на панели задач, "жрет ресурсы". Сколько окон на экране - столько форм создано. Надоело - закрыл. Параллельно можно работать с несколькими формами. Всякие вспомогательные окошки и просмотры, типа "Сделки за период", "История продаж" сделаны по контекстному меню. И Word & Excel тоже используются, но они вынесены в DLL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 15:38 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
У меня тоже во многих проектах большое количество форм, и я уже давно перешёл на создание форм по требованию. Но, при этом часто используемые формы обычно создаются в начале и всегда "висят в памяти". Что касается описываемого случая, то я бы сделал следующее. Предложенный способ с 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 вполне уместно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 16:28 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
To Speacer: Действительно формы висят в памяти (опечатка вышла) и создаются по требованию. Вначале создается толко форма для открытого таба (запоминается при выходе). И как я уже говорил формы управляют активностью DataSet-ов, так что открывается самый минимум. При переходе на новый таб по требованию создается новая форма, а после этого при необходимости освобождается форма старого таба. Точно также с детальками - надо создалась, не хватает ресурсов - освобождаются. И разумеется человек не ждет, пока загрузятся все формы. Многоформенное приложение вообще конечно неплохо. И ненавязчиво решается проблема по закрытию форм - болше 4 форм в трее чисто психологически засавляют типичного пользователя чувствовать себя неуютно и закрывать ненужные окна. Хотя, если вдруг пользователь все таки откроет штук 10 окон - могут возникнуть проблемы с ресурсами. В таком случае можно перед созданием формы контролировать свободные System-ресурсы и выдавать предупреждение вроде "Закройте неиспользуемые программы". Но мне как то не по душе многоформенность. Я уже давно пишу приложения с использованием табов в основных формах. И народу нравится. Просто раньше в них были обычные панели с контролами. Приложения все усложнялись и усложнялись и в один прекрасный момент для них перестало хватать ресурсов (если загружать табированную форму целиком). Пришлось вставлять в табы формы ну а дальше я уже рассказывал... to alex_k. По поводу форм в табах(в любом TWinControl) можно посмотреть например MergeForm из RXLIB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 16:56 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
2 koff4 Ну хрен знает, мне кажется пока ты не откажешься от размещения пол-программы на одной форме, проблемы не решатся... Суть в том, что если в главной форме человек откроет _все_ закладки, то у тебя будет создано туева хуча форм, которые пожрут:) ресурсы, вариант с таймером - на мой взгляд изврат, а как по другому сделать освобождение я не представляю. Проблема даже не в том, что формы в табах, а в том, что их слишком много и они слишком сложные, IMHO. У меня табы используются только в модальных формах свойств (как в виндах). Их количество никогда не превышает 5. Я все таки не понял, что это означает: Действительно формы висят в памяти (опечатка вышла) и создаются по требованию по моему одно противоречит другому. По моим понятиям, "висят в памяти" означает, что они созданы, но невидимы, то бишь жрут ресурсы. По требованию, это как описал Дмитрий Мыльников. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 17:11 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
В данном случае я предпочел бы создать MDI приложение и дать пользователю самому решать какие формы ему нужны. Скорость создания формы в основном определяется БД (скорость исполнения запросов), если это не P100 16MB :-). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 17:16 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
To Дмитрий Мыльников: Ну наконец-то дождался ответа на вопрос по сабжу. Надо же - по всем признакам однопоточное приложение оказывается многопоточным. Большое спасибо!!! По поводу соображений по освобождению - полностью согласен. У меня всем этим рулит специальный класс-менеджер. При создании форма в нем регистрируется. При активизации формы происходит Lock в менеджере, чтобы случайно не освободить используемую форму. При закрытии происходит Unlock и начинается отсчет времени жизни формы. Опционально может быть уничтожен Handle формы. Каждая форма обладает квотой в процентах, которые нужны ей для нормального создания (у меня для мелких форм - 4%, для больших - 10%). Перед созданием у менеджера запрашивается необходимое количество ресурсов и если что, рушатся формы в порядке времени бездействия. Кроме того по таймеру(раз в 0.5 секунд) происходит контроль так называемой "черной метки" (у меня 3%). Если она достигнута (например запустили какой нибудь фотошоп, хотя непонятные провалы ресурсов наблюдаются довольно часто) опять же освобождается до необходимого значения (10%) GDI - память. При освобождении менеджер устанавливает в nil переменную формы (задается при регистрации). Дополнительно производится контроль "левых" форм. Обычно это недосозданные при Create формы. У они либо не преобразуются в TForm, либо в них ComponetCount = 0 или наоборот ComponentCount > 1000. Такие формы также обнуляются. Еще раз большое спасибо!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 17:20 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
2 Дмитрий Мыльников RTL сама запускает новые потоки, Все верно, но сам koff4 -то использует только один поток. Поэтому я и не понимаю, чем ему может помочь BeginWrite/EndWrite. 2 koff4 ...чисто психологически засавляют типичного пользователя чувствовать себя неуютно и закрывать ненужные окна. Хотя, если вдруг пользователь все таки откроет штук 10 окон - могут возникнуть проблемы с ресурсами. В таком случае можно перед созданием формы контролировать свободные System-ресурсы и выдавать предупреждение вроде "Закройте неиспользуемые программы". Абослютно неверное утверждение! Почитайте статьи по проектированию интерфейсов, юзабилити. Не надо напрягать пользователя проблемами программы! Ему - пользователю - нет никакого дела, до того есть свободные ресурсы, нет их (вы еще заставьте его байты считать перед открытием окна - типа влезет или нет), у него своя работа. Т.е., для пользователя все это должно проходить незаметно. Далее, между быстро, но с Acess Violation или медленно, но без ошибок, я бы выбрал второй вариант. Если касаться же вашего случая - во-первых, неплохо было бы определить, почему именно медленно открывается форма. Что там тормозит? Само создание даже довольно сложно формы обычно происходит быстро. Задержки могут быть при открытии запросов, при переключении MDIChild в модальное и пр. во-вторых, если уж писать свой пул форм, то я это вижу так: - список всех загруженных, но не активных форм - статистика вызовов к форме - определение свободной памяти в системе - если меньше некого порога, то ее выгр. наименее вызываемую и все делать как раз в отдельном потоке. Но овчинка выделки не стоит. Гораздо проще и выигрышнее, напр. просто закэшировать наиболее часто используемые справочники и списки и не дергать сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 17:26 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
Да, вдогонку. На самом деле определить количество свободной памяти в Windows не так просто. Дело в том, что MS после закрытия приложений не сразу возвращает осводившуюся память, а держит ее как некий пул - на тот случай, если юзер, захочет обратно вернутся. Очень наглядно видно, если Ворд открыть-закрыть-открыть. Они там, тоже как koff4, все что-то считают, освобождают, резервируют :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 17:31 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
to aaq: Я имел ввиду ресусы GDI-сегмента который в Win98 равен 64K. Посмотреть на его текущий размер можно запустив в русской винде Стандартные-Служебные-Индикатор ресурсов. Для определения оставшейся памяти из программы приходится с некоторыми извращениями вызывать недокуменитированную функцию GetFreeSystemResources из User.exe. Когда ресурсы заканчиваются то: 1. При загруске ресурсов форм ывдается сообщение "Параметр задан неверно" и формы остается в проиежуточном кривом состоянии. 2.Выдается стопка сообщений "Canvas dos not allow drawing". 3. После чего все виснет наглухо - помогает только Ctrl-Alt-Del или вообще аппаратный Reset. А по поводу "не сразу возвращает осводившуюся память" - ресурсы GDI освобождаются мгновенно - проверено. Кстати, сами майкрософтовские приложения (Word в частности) используют ресурсы GDI крайне незначительно. Очевидно в основном используется глобальная память системы. Ай молодцы!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 17:49 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
Во-первых, как сэкономить системные ресурсы. Начнём стого, что не все компоненты эти самые ресурсы потребляют. Часть компонентов не имеет собственного дескриптора окна, а использует дескриптор окна хозяина, куда он вставлен. Например те же 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. А то, что периодически ресурсы сьедаются полностью говорит скорее о том, что всё-таки процесс создания/удаления форм происходит не всегда корректно и бывают случаи, когда новая форма создаётся поверх уже существующей. Тогда использованные этой формой ресурсы будут намертво заблокированны до выхода из программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2003, 20:57 |
|
||
|
GlobalNameSpace в однопоточном приложении
|
|||
|---|---|---|---|
|
#18+
2 Дмитрий Мыльников: Вы подняли очень интересный (для меня) вопрос. Во-первых - про экономию ресурсов - а как определить вообще сколько памяти занимает тот или иной компонент на форме? Сколько памяти будет отжирать форма при создании? То что TBevel более экономит ресурсы это я знаю, но на сколько? И второе - да, GDI TDataModule не потребляют. Но, как я понимаю, в этом случае все DataSet создаются сразу - память задачи пожирают также сразу. Если же они лежат на форме, то создаются тогда. когда создается форма, - по мере необходимости. Т.е., теоретически, выигрыш в скорости создания формы будет получен за счет замедления в запуска пр-мы (или когда содается ДатаМодуль?) и опять проигрываем в потреблении ресурсов. Для меня этот подход еще удобнее и тем, что легче найти соотв. датасет к форме. Прав ли я? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2003, 16:00 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=2023&tid=2117490]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
51ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 258ms |
| total: | 431ms |

| 0 / 0 |
