Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.029 c
14-84644
SPeller
2003-06-08 11:10
2003.06.26
Бесконечная история


1-84194
Schredder
2003-06-12 10:45
2003.06.26
Richview или Memo


1-84087
fs_more
2003-06-09 13:36
2003.06.26
Неопределенность при вызове метода TThread.Terminate


1-84146
Comp
2003-06-10 12:02
2003.06.26
Как, если возможно, обработать событие прокручивания у формы...


8-84463
Salavat
2003-03-05 15:31
2003.06.26
И все-таки об использовании сканера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский