Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что-то с диспетчером памяти в D7... 
:(
    Опции темы
vadII
Дата 19.4.2006, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.4.2006

Репутация: нет
Всего: нет



Вообщем у меня многооконное приложение написанное в D7, кол-во одновременно используемых (созданных) форм может быть более 100 и т.д. Столкнулся с проблемой что при созданнии определенного кол-ва экземпляров базовой формы программа без ошибок падает. Заметил что при этом кол-во определяется выделением около 16Mb если смотреть в Диспетчере Задача Windows. 

Написал простой пример: есть главная форма с кнопкой и лейблом и вторая форма пустая (TForm2), наследник TForm. По кнопке с главной формы выполняется следующее:

Код

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
try
for i:=0 to 30000 do begin
TForm2.Create(Self);
Label1.Caption := IntToStr(i);
if (i mod 100) = 0 then Application.ProcessMessages;
end;
ShowMessage('OK');
except
on E:Exception do ShowMessage(E.Message);
end;
end;


Программа создает около 1300 экземпляров форм и падает (причём иногда вместе с Delphi). Самое интересное что если вместо TForm2.Create написать TForm.Create то прога спокойно делает 30000 экземпляров (больше не пробовал) причём с гораздо большей скоростью! Пробовал тот же пример в C++ Builder там всё замечательно работает, создаёт и 200000 форм с еще большей чем в дельфи скоростью и с гораздо меньшим жором памяти. 30000 экземпляров в D7 = 42Mb, 200000 экземпляров в Builder = 27Mb... 

Подскажите где копать, может какой менеджер памяти подключить другой...
  
PM MAIL   Вверх
x77
Дата 19.4.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



если форма полностью инициализируется в run-time, т.е. ты не балуешься установкой свойство формы и её объектов "вручную", то можно ускорить всю байду путём отказа от загрузки *.dfm файла.

т.е. в твоём примере можно вместо TForm2.Create сказать TForm2.CreateNew. но меньше памяти она жрать не станет, насколько я понимаю. 


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
vadII
Дата 19.4.2006, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.4.2006

Репутация: нет
Всего: нет



Цитата(x77 @  19.4.2006,  19:16 Найти цитируемый пост)
если форма полностью инициализируется в run-time, т.е. ты не балуешься установкой свойство формы и её объектов "вручную", то можно ускорить всю байду путём отказа от загрузки *.dfm файла.

Проблема не в этом, в примере TForm2 просто наследник TForm без дополнительных методов, свойств, переменных, вообщем пустая форма smile Но каким-то образом это очень сильно влияет на скорость создания объекта smile И что самое главное на работоспособность. 
PM MAIL   Вверх
x77
Дата 19.4.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



vadII, я понимаю smile но в дельфях же не так просто всё, как в си, где ты пишешь своими руками и хотя писать - дофига, ты всегда уверен, что выполняется только то, что ты написал....  здесь всё веселее. вот ты вызвал конструктор класса, TForm.Create. это далеко и совсем не эквивалентно вызову CreateWindowEx:

Код

constructor TCustomForm.Create(AOwner: TComponent);
begin
  GlobalNameSpace.BeginWrite;
  try
    CreateNew(AOwner);
    if (ClassType <> TForm) and not (csDesigning in ComponentState) then
    begin
      Include(FFormState, fsCreating);
      try
        if not InitInheritedComponent(Self, TForm) then
          raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
      finally
        Exclude(FFormState, fsCreating);
      end;
      if OldCreateOrder then DoCreate;
    end;
  finally
    GlobalNameSpace.EndWrite;
  end;
end;


очевидно, что CreateNew занимается именно созданием нового экземпляра класса, а InitInheritedComponent - инициализацией этого экземпляра. если от этой инициализации отказаться (что допустимо, если ты работаешь без использования DFM), то производительность сразу увеличиться в разы - проверь скорость твоего примера, если Create заменить на CreateNew. 


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
vadII
Дата 19.4.2006, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.4.2006

Репутация: нет
Всего: нет



Спасибо, но скорость меня совершенно не интересует, меня волнует предел по кол-ву форм (как пример), при том что этого предела нет в C++ Builder который использует тежи VCL. 

У меня в проекте не 200000 и не 1300 экзепляров форм, а реально меньше, но при этом можно тупо и 1300 понаоткрывать и более. При этом базовая форма содержит много доп.компонентов (чарты, гриды и прочее).  Формы не всегда отображается на экране, они открываются и закрываются (но не освобождаются из памяти, т.к. содержат в себе изменения который сделал пользователь), и пока пользователь не сохранит изменения НЕЛЬЗЯ ничего освобождать, при этом теоретически пользователь может сделать измения в сотнях формах, и вот на 101 прога упадёт... При этом в проге нет никаких утечек памяти, подлюченный менеджер памяти FastMM4 молчит. 

Пока я могу создать из программы всего около 180 экземпляров, что оч.мало, но сейчас наткнулся на то что если из базовой формы убрать TMainMenu то кол-во сразу возрастает до 700 smile Этого тоже теоретически мало, так же как и мало 1300 экземпляров ПУСТОЙ формы на которые способен Дельфи с его VCL... И это вдвойне обидно, т.к. билдер по каким-то причинам не имеет таких ограничений  smile  
PM MAIL   Вверх
Sunvas
Дата 20.4.2006, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Попробуй поизучать эту тему. Может поможет
Работа с процедурами и окнами 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0547 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.