Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
ВнизКак бороть баг с 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.036 c