Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Проблемы с компиляцией большого проекта Добавлено: 14.09.05 12:09  

Автор вопроса:  Comanche
Есть "большой" проект на VB6 - куча форм, подцеплено большое количество контролов и библиотек. Из VB IDE запуск с полной компиляцией проходит успешно: всё работает. При попытке собрать EXE-шник - на стадии "Writing EXE..." слетает с ошибками "Error loading [имя_формы], подробности смотрите в файле [имя_формы].log". Это мессаджбокс большого (нестандартного) размера, в котором вышеприведённый текст написан здоровенным шрифтом типа System или Terminal. Таких мессаджей выскакивает штук несколько, после чего Бэйсик падает окончательно (типовое окно WinXP с предложением прибить "плохое" приложение). К тому же начинается фигня с GDI-подсистемой: коверкаются все открытые окна, слетают шрифты и т.д. и т.п.

Если смотреть таск-менеджером, то слёт происходит, когда число GDI-объектов, открытых процессом VB6.EXE, доходит до 10 тысяч. Насколько я понимаю, это некая "квота".

Винда - WinXP SP2 со всеми патчами. Студия - с последним (шестым) сервис-паком.

Вместе с тем, на отдельном - "специальном сборочном" - компе с WinNT 4.0 (и с минимумом запущенных служб) сборка EXE-шника происходит более или менее нормально. Т.е. иногда наблюдается та же фигня, а иногда - EXE-шник создаётся нормально.

Понятно, что грабли связаны с утечкой GDI-ресурсов, но вот как это исправить?! Проект модифицировать нельзя - это просто догма. Пытался компилить не из VB IDE, а из командной строки - тот же результат, т.е. даёт дуба на 10 тысячах GDI-объектов (ну разве что мессаджей выскакивает поменьше).

При всём при этом, откомпилённый проект работает нормально, никаких GDI-утечек в run-time режиме не наблюдается, проблем с экраном тоже нет никаких.

Я и раньше такое наблюдал, но перезагрузка (бэйсика или в крайнем случае компа) всегда помогала. Помогала также выгрузка "лишних" служб и процессов. Однако сейчас - никакого эффекта.

Очень это всё похоже на какой-то баг бэйсика. Хотя на сайте MS ничего найти не удалось... Есть идеи?!

Ответить

  Ответы Всего ответов: 21  

Номер ответа: 1
Автор ответа:
 «UL.eXe»



ICQ: 197.895.916.247 

Вопросов: 72
Ответов: 540
 Профиль | | #1 Добавлено: 14.09.05 13:01
Возможно VB не может справиться с большим обьектом, не хватает ресурсов компильнуть его.
Тоже самое происходит когда ты бытаешься в блокноте открыть файл в допустим мегабайт 20ть.

Единственное решение, я думаю, уменьшить сам проэкт.. Вынести некоторые его функции в DLLки, и загружать их в проэкт;

Поэтому все ПО больших размеров имеют кучу вспомагательных дров.

Есть у кого-небудь решение лучше??

Ответить

Номер ответа: 2
Автор ответа:
 User Unknown



Вечный Юзер!

ICQ: uu@jabber.cz 

Вопросов: 120
Ответов: 3302
 Профиль | | #2 Добавлено: 14.09.05 13:04
Гм.. какова конфигурация самого компа и какого же размера у тебя получается exeшник?!

Ответить

Номер ответа: 3
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #3 Добавлено: 14.09.05 13:22
Комп - P-IV 3200MHz, 1GB RAM. Video - Intel 82865G. EXE-шник - 2.54MB.

Менять структуру проекта - не могу. Пока не могу. Обойти ограничение на 10 тысяч GDI-объектов - вряд ли возможно (это, наверное, на уровне ядра винды сделано). Но тот факт, что существует комп, на котором всё же компиляция проходит, говорит о том (имхо), что на этом компе бэйсик просто ведёт себя по-другому... вероятно - пошустрее захлопывая GDI-объекты, которые ему становятся не нужны - вот в итоге число открытых (живых) GDI-объектов и не доходит до планки в 10 тысяч штук...

Ответить

Номер ответа: 4
Автор ответа:
 «UL.eXe»



ICQ: 197.895.916.247 

Вопросов: 72
Ответов: 540
 Профиль | | #4 Добавлено: 14.09.05 13:27
Комп - P-IV 3200MHz, 1GB RAM. Video - Intel 82865G. EXE-шник - 2.54MB


2.54Мб?
Друг мой, это у тебя с VB что-то или действительно 10 тысяч GdI..

Ответить

Номер ответа: 5
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #5 Добавлено: 14.09.05 13:29
Размер EXE-шника тут ни при чём - разве что косвенно. Не о том речь. Да и не сказал бы я, что для "промышленного" приложения это особо много...

Ответить

Номер ответа: 6
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #6
Добавлено: 14.09.05 20:40
2Comanche, если проблемма винды, то может имеет смысл откомпилить попробовать проект на x64 версии ?? Разумеется что для этого потребуется и 64-битный проц... (пусть она сейчас и не подходит для повседневной работы, драйверов не хватает :(, но для тестов и пр. ерунды - вполне мона :)))

Ответить

Номер ответа: 7
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #7 Добавлено: 14.09.05 21:00
Если на другом компе скопилила, значит собака скорее в самом компе а не в проекте или в басике... Вообще-то 10 тыс. GDI объектов это смешно, пока читаешь такое на форуме :)) Не смешно когда действительно их у тебя 10 тыс. Мне кажеться это через чур много, т.е. надо как-то переделать проект изменив в нём GDI структуру, и/или самому пробовать избавлятся от ненужныйх GDI объектов. Если прокт нивкакую нельзя трогать, то пробуй компилировать там где оно получается, т.е. там где винда и комп не загинается.. :)

Ответить

Номер ответа: 8
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #8
Добавлено: 14.09.05 21:03
хоть бы иногда звкрывал ненужные hDC что ли ... или не в этом бан?

Ответить

Номер ответа: 9
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #9 Добавлено: 14.09.05 22:05
Короче, есть некое учреждение (штук 200-300 компов), и самописная система (VB6 + хренова туча таблиц и хранимок на MS SQL Server 2000). Работает отлично, написана натурально "самородком" (ну просто "монстром бэйсика" каким-то), но... очень громоздкий проект (хотя и так всё, что можно, вынесено в DLL-ки!). Куча контролов типа от Sheridan'а, ComponentOne etc. Ничего трогать нельзя (по крайней мере - ничего "глобального";) - типа "работает - ну и чудненько" :) Но периодически вносятся мелкие изменения, и надо бывает полностью перекомпилить EXE-проект (хотя чаще изменения касаются DLL-функционала, слава богу). И вот тут нет уверенности: а вдруг "сборочная тачка" загнётся, - и чё тады делать?! Пока нет ясности в причине вышеописанного бага - нет и уверенности... нет и возможности найти баг-фикс...

Не думаю, что досконально разберусь в чужом проекте быстрее, чем за 3-4 месяца. А ведь только тогда я бы смог ещё что-нибудь вынести из EXE в DLL... но пока рано об этом говорить - вот и парюсь :(

Ответить

Номер ответа: 10
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #10
Добавлено: 15.09.05 03:47
10 тыс. - это не ограничение Винды, это она просто не проверяет, когда твои GDI-объекты начинают затирать другие - я писал прогу, которая по таймеру GetDC, но потом не ReleaseDC, память, занимаемая программой росла до тех пор, пока ее зарезервированные и не освобожденные DC не затирали DC Винды, тогда сразу начинались артефакты подобные описанным тобой (сообщения шрифтом System объясняются тем же: Винда не может создать шрифт, потому что память занята GDI-объектами). Поскольку при компиляции как-то контролы уже исполняют свой код, засирая память своими GDI-объектами, ошибка вылетает при компиляции. В рабочей программе без изменения можно было бы исправить баг - повесить монитор, который отслеживает создание GDI-объектов и убивает те, к которым не было обращений или т.п. (типо GC), но как это сделать при компиляции, хз. Объясни начальству (или заказчику), чтобы не использовали кривые компоненты, или использовали их поменьше.

Ответить

Номер ответа: 11
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #11 Добавлено: 15.09.05 09:14
Однако, откопал вот эту ссылку:
http://support.microsoft.com/?kbid=838283

Цитирую (фрагмент):

Application menus and context menus are improperly displayed for other applications when a process exceeds its graphics device interface (GDI) object quota. (The default object quota is 10,000.)


Похоже, всё-таки есть ограничение...

Ответить

Номер ответа: 12
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #12 Добавлено: 15.09.05 09:33
При помощи одной проги посмотрел, на каких именно GDI-объектах идёт слёт. Это битмапы и кисточки. А вот как бы понять, откуда у них "ноги растут"?! Т.е. в идеале - отловить, какой именно из компонентов, участвующих в сборке проекта, является хозяином этих битмапов... такое вообще возможно?

Ответить

Номер ответа: 13
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #13
Добавлено: 15.09.05 13:38
Гы, изврат поганый :) И Винда, как водится, вместо того, чтобы послать программу, пытающуюся создать еще объект, начинает глючить и затирать свои объекты после создания программой совершенно неестественного числа объектов :)

Ответить

Номер ответа: 14
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #14 Добавлено: 15.09.05 14:57
Не, ну после 10-20 "кривых" мессаджбоксов она всё же пишет, что "VB has encountered a problem and must be closed" :))

Ответить

Номер ответа: 15
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #15 Добавлено: 15.09.05 14:58
И вообще: каким боком при компиляции могут создаваться битмапы и кисточки?!?!?! да ещё в таких количествах!

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам