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

Вниз

Как бороть баг с 300-ми кнопками?   Найти похожие ветки 

 
Bosso   (2003-06-11 09:57) [0]

Delphi 5. Берем пустую форму. Бросаем на нее 300 кнопок с glyph"ами. Запускаем. Возникает exception "Win32 API function failed". По моим наблюдениям, только в win9x. Как бороть злой баг?
Этот вопрос интересует меня уже давно. Сам разобраться не могу, и никто не может помочь! Неужели никто из монстров не разбирался?


 
Spawn ©   (2003-06-11 10:05) [1]

У меня было подобное под виндой 9х. В ХП,Вин2К все было ок.


 
Bosso   (2003-06-11 10:07) [2]

В этом и вопрос! Именно 9x!


 
An1   (2003-06-11 10:11) [3]

А, если не секрет, зачем на форму бросать 300 кнопок?


 
Bosso   (2003-06-11 10:16) [4]

300 кнопок - это для примера. Простейший пример. Этот же баг возникает в больших проектах, где большое количество элементов управления.


 
KSergey ©   (2003-06-11 10:21) [5]

> 300 кнопок - это для примера. Простейший пример.

Это простейший, заметьте... ;)

Надо как-то иначе делать интерфейс программы, видимо.


 
Bosso   (2003-06-11 10:24) [6]


> Надо как-то иначе делать интерфейс программы, видимо.


Такие советы, извините, я и сам раздавать могу. Как, если не секрет? Без кнопок, скроллбаров и имаджей? Я же не драйвер пишу.


 
Bosso   (2003-06-11 10:26) [7]

Кстати, поставьте 30 кнопок и запустите программу 10 раз - тот же эффект.


 
Valet   (2003-06-11 11:00) [8]

У тебя просто кончаются GDI ресурсы (кнопки с картинками), если будешь использовать просто кнопки должно работать.
Для картинок на базе TBitmap ты по идее должен вызывать методы Release... для освобождения ресурсов GDI.


 
clickmaker ©   (2003-06-11 11:17) [9]

В 9х может быть максимум 16384 открытых GDI объектов (кистей, перьев, регионов и пр.). Столько же может быть и открытых окон. Отсюда вывод: не юзать сразу много кнопок и отключать Auto-create форм в проекте


 
Думкин ©   (2003-06-11 11:32) [10]

> clickmaker © (11.06.03 11:17)
> В 9х может быть максимум 16384 открытых GDI объектов

Если верить Фэнь Юаню - то такая же фигня и в 2000. Причем одно приложение может заюзать меньше 12000.
Просто в 9* этого предела достичь не удается - ГДИ ресурсы съедаются раньше. Это не злой баг Виндов - это твой злой баг.
Просто в 9* надо быть жадным и акуратным в использовании графики.

Я как-то написал приложение, которое просто создавало формы - в 2000 я смог их сделать 1500 штук, при этом юзалось около 8000 объектов ГДИ - после этого приложение сдохло. Под 98 на моем оно бы и до 400 не дотянуло.


 
Bosso   (2003-06-11 11:33) [11]

Насчет Auto-create - совет хороший... Если форм много, и вызываемая форма создается только на время работы, имхо. Но у меня большая многостраничная форма, куда считывается куча данных с некоего устройства (счетчик эл.энергии). Эту приблуду просто невозможно разбить на маленькие окна! И вот кнопочкой Run я запускать проект уже давно не могу (т.к. кол-во объектов удваивается), и чуствую, что будут глюки и просто так. Неужели нет способа побороть баг? Ведь Delphi7 такой экзешник создает (с пресловутыми 00-ми кнопками), что все работает... Просто 7-й по некоторым причинам нельзя использовать.


 
clickmaker ©   (2003-06-11 11:36) [12]

Значит Д7 более грамотно с GDI работает... Загляни в исходники TBitBtn или TSpeedButton от Д7 и сравни с 6 или 5, может там и найдешь разгадку...


 
DrPass ©   (2003-06-11 11:38) [13]

А ты пробовал в Win95? В 98-й количество ресурсов заметно увеличено


 
Sandman25 ©   (2003-06-11 11:39) [14]

>Но у меня большая многостраничная форма

Создавайте содержимое страницы при переключении на нее.


 
Bosso   (2003-06-11 11:43) [15]


> Значит Д7 более грамотно с GDI работает... Загляни в исходники
> TBitBtn или TSpeedButton от Д7 и сравни с 6 или 5, может
> там и найдешь разгадку...

в том-то и дело, что не нашел! :_(

кстати, создавать прогу именно под вынь9х - одно из требований. Нужно, чтобы оно работало на 486-х ноутбуках. Не у всех, видите ли, в регионах (например, в Ханты-Мансийском АО или Узбекистане) есть Pentium XVI с Windows 3000 XXP...


 
Bosso   (2003-06-11 11:45) [16]


> Создавайте содержимое страницы при переключении на нее.


Ну это если совсем ничего не поможет...



 
clickmaker ©   (2003-06-11 11:52) [17]

Если форма многостраничная (TPageControl ?), то возможен такой вариант: для каждой страницы делаешь TFrame, на него кидаешь все эти кнопки. Но фрейм создаешь только при открытии страницы, а при закрытии - фрейм чикаешь или скрываешь, на худой конец.


 
Думкин ©   (2003-06-11 12:09) [18]

Штука еще в том, что твоя программа может и не запускаться порой. Если ресурсы уже кем-то пожеваны.
Когда у меня была программа, которая могла сильно уменьшать ресурсы - я вставлял проверку. И при некотором нижнем пороговом - не запускал программу, предварительно выдавая сообщение.
Если ресурсы системы сильно снижались - то выдавал предупреждение.
Винда дает его иногда поздно = когда уже ничего предпринять нельзя.


 
Sandman25 ©   (2003-06-11 12:21) [19]

>Ну это если совсем ничего не поможет...

Если нужно работать на 486 проце с 4Mb памяти, то придется отказаться от создания 300 кнопок при загрузке программы.


 
KSergey ©   (2003-06-11 12:35) [20]

> Sandman25 © (11.06.03 12:21)

Вот именно.
Впрочем, мне и комментарий Bosso(11.06.03 11:45) Ну это если совсем ничего не поможет... тоже понравился
На это есть только один ответ: а кому сейчас легко?

А советы действительно можно давать разные, но я же не знаю задачи, какой придуман интерфейс. Как я могу посоветовать что-то более конкретное? Да и кому деньги платят за эту работу, а? ;)

Эти кнопки как - на одной форме? Можно создать одно большое изображение, и программно обрабатывать клики по разным его участкам - вот и аналог множества рядом стоящим кнопкам. Да, бордюры нажатой/отжатой кнопки надо отрисовывать самостоятельно. А еще кнопки обрабатывать. А как еще интересно вы хотели выполнить весьма жесткое требование работы на слабых машинах?

PS: а тарифы на энергию растут и растут... Впрочем, это к их менеджменту относится...


 
Владимир Васильев ©   (2003-06-11 12:41) [21]

попробуй глифы хранить в одном большом файле и отрисавывать их на кнопках без графического контейнера по onPaint - это должно решить пролему с ресурсами


 
Bosso   (2003-06-11 12:45) [22]


> Если ресурсы системы сильно снижались - то выдавал предупреждение.

Пример кода можно, как отловить снижение ресурсов?


> PS: а тарифы на энергию растут и растут... Впрочем, это
> к их менеджменту относится...

ну мы же не энергию продаем, а всего лишь изготавливаем счетчики... Так что не Чубайс я...

Короче, спасибо всем, кто отозвался. Главное я понял: единственный выход - тем или иным способом уменьшить количество элементов управления, одновременно находящихся в памяти. Я просто думал, может, дельфя неправильно память отводит... Или еще чего... и это можно радикально лечить. Ну нет так нет.


 
Bosso   (2003-06-11 12:48) [23]


> попробуй глифы хранить в одном большом файле и отрисавывать
> их на кнопках без графического контейнера по onPaint - это
> должно решить пролему с ресурсами

Да там уж нет на самом деле никаких глифов - это просто для примера было. С глифами только тулбар вверху формы. Ну кнопок 10 там...


 
Думкин ©   (2003-06-11 13:05) [24]


CheckDLL = "rsrc32.dll";
CheckFuncDll = "_MyGetFreeSystemResources32@4";
rSystem=0;
rGDI=1;
rUSER=2;

TCheckFunc = function(i:integer):integer;stdcall;

CheckFunc : TCheckFunc;

Подключаешь функцию CheckFuncDll из CheckDLL. И потом:
Этой библиотеки может и не оказаться в 9* -если не установлен индикатор ресурсов. Функция возвращает остатки соответствующих ресурсов в процентах.

if (CheckFunc(rSystem)<cMinResources)or
(CheckFunc(rUser)<cMinResources)or
(CheckFunc(rGDI)<cMinResources) then

Конечно, это не идеал, но хоть что-то.



Страницы: 1 вся ветка

Текущий архив: 2003.06.26;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.024 c
6-84496
Akni
2003-04-22 16:18
2003.06.26
Nonblocking Socket в отдельном потоке


14-84730
SpoinT
2003-06-05 15:33
2003.06.26
Как изменить заголовок файла exe


7-84778
Landgraph
2003-04-16 18:34
2003.06.26
Power Off in NT


1-84187
Юнгман
2003-06-11 14:54
2003.06.26
ComboBox


14-84568
comintegrator
2003-06-07 08:37
2003.06.26
integer & string