Форум: "Основная";
Текущий архив: 2010.02.14;
Скачать: [xml.tar.bz2];
ВнизОчень странное срабатывание секции INITIALIZATION Найти похожие ветки
← →
IGray (2009-03-10 12:16) [0]Есть модуль. В нём одна процедура и секция инициализации.
Ставлю точки остановки на первую строчку в процедуре и первую строчку секции инициализации. Запускаю (F9).
Управление сначала попадает В ПРОЦЕДУРУ!!! И только потом - В СЕКЦИЮ ИНИЦИАЛИЗАЦИИ!
Вопрос: как такое вообще возможно?? В какой ситуации???
Не сообщаю дополнительные обстоятельства потому, что не могу понять, какие из них существенны...
Считал, что секция инициализации по определению вызывается первой ВСЕГДА!
Очень интересно мнение профессионалов!
← →
clickmaker © (2009-03-10 12:19) [1]> Управление сначала попадает В ПРОЦЕДУРУ!!! И только потом
> - В СЕКЦИЮ ИНИЦИАЛИЗАЦИИ!
а процедура-то откуда вызывается? не из секции инициализации? -)
← →
IGray (2009-03-10 12:36) [2]Вызывается из секции инициализации ДРУГОГО модуля.
А даже если б из этого - как это объясняет, что управление сначала попадает в процедуру, и лишь потом - на ПЕРВУЮ строчку секции инициализации? Я в недоумении..
P.S. Юзаю Delphi7
← →
clickmaker © (2009-03-10 12:38) [3]> [2] IGray (10.03.09 12:36)
> Вызывается из секции инициализации ДРУГОГО модуля.
а модули в каком порядке в файле проекта?
← →
IGray (2009-03-10 12:46) [4]Сорри, а какая разница?
Если процедура из модуля А вызывается из секции инициализации модуля Б, то это значит, что модуль А указан в списке USES модуля Б, и по-любому секция инициализации модуля А должна ведь была сработать первой...
Мож это какой-то известный баг Дельфи?
← →
Anatoly Podgoretsky © (2009-03-10 12:49) [5]> IGray (10.03.2009 12:16:00) [0]
Код нужен и описание, что и когда вызывается, но видимо ты что то путаешь, инициализацию не требуется вызывать.
← →
Palladin © (2009-03-10 12:49) [6]Начни не по F9, а по F7 и посмотри, что начинает исполнятся
← →
IGray (2009-03-10 13:16) [7]
> инициализацию не требуется вызывать
Сорри, в каком смысле? Поясните свою мысль пожалуйста.
До инициализации модуля А процедура в нём не работает правильно...
На самом деле проект крупный, много модулей и кода, поэтому здесь выложить сложно.. Но я пока не понимаю, как это может повлиять на суть вопроса...
Проект скомпилирован с опцией "Build with Run-Time packages"
← →
Anatoly Podgoretsky © (2009-03-10 13:19) [8]> IGray (10.03.2009 12:36:02) [2]
Секции инициализации не должны вызывать процедуры из других модулей, явно или косвенно.
← →
Anatoly Podgoretsky © (2009-03-10 13:19) [9]> clickmaker (10.03.2009 12:38:03) [3]
Я легко обеспечу кросс зависимость.
← →
Дмитрий Белькевич © (2009-03-10 13:30) [10]>На самом деле проект крупный, много модулей и кода, поэтому здесь выложить сложно.
Тестовый пример делай, как проявляется проблема. Может и сам поймёшь почему, а нет - то всем покажешь.
А так - только гадание на гуще.
Так же разумно включить компиляцию с дебажными либами и посмотреть колл-стэки, кто что и когда вызывает.
← →
Riply © (2009-03-10 13:54) [11]> [8] Anatoly Podgoretsky © (10.03.09 13:19)
> Секции инициализации не должны вызывать процедуры из других модулей, явно или косвенно.
Это ээээ... пуленепробиваемое правило, или от него, иногда, можно отступать ?
← →
Дмитрий Белькевич © (2009-03-10 13:57) [12]Можно отступать, вообще, от многого. Главное - что бы потом не биться головой об стену в поисках ошибки, как ТС.
← →
Palladin © (2009-03-10 14:00) [13]
> Riply © (10.03.09 13:54) [11]
Это правило Анатоля и чем дальше ты от него, тем безопасней не следовать этому правилу. :)
← →
IGray (2009-03-10 14:08) [14]
> Секции инициализации не должны вызывать процедуры из других
> модулей, явно или косвенно.
А вот это интересно, так как это реально ново для меня. Раньше этому правилу никогда не следовал и проблем не имел. Можете ли обосновать свою мысль?
> Тестовый пример делай
Похоже, этого не избежать, спасибо!
← →
Palladin © (2009-03-10 14:13) [15]
> А вот это интересно, так как это реально ново для меня.
Я думаю, что это реально ново и для борланда, вот они удивятся :) Ведь добрая часть VCL не следует правилу Анатоля! :)
← →
просто так (2009-03-10 14:13) [16]модули циклически ссылаются друг на друга interface - implementation
← →
Anatoly Podgoretsky © (2009-03-10 14:16) [17]> Riply (10.03.2009 13:54:11) [11]
Можно, когда есть увереность.
← →
просто так (2009-03-10 14:17) [18]+ >>Секции инициализации не должны вызывать процедуры из других модулей, явно или косвенно.
тогда порядок INITIALIZATION будет отличаться от задуманного
← →
Anatoly Podgoretsky © (2009-03-10 14:17) [19]> IGray (10.03.2009 14:08:14) [14]
Как же не имел, а что тогда плачешь?
← →
Anatoly Podgoretsky © (2009-03-10 14:19) [20]> просто так (10.03.2009 14:17:18) [18]
Порядок не будет отличаться, а рабоспособность будет.
← →
просто так (2009-03-10 14:24) [21]Будет отличаться порядок вызова секций INITIALIZATION разных модулей соответственно и работоспособность
← →
IGray (2009-03-10 14:37) [22]
> Как же не имел, а что тогда плачешь?
Не имел раньше, хотя использовал часто...
Интересно, а на процедуры из стандартных дельфийских модулей согласно Вашему правилу, ссылаться можно?
← →
IGray (2009-03-10 14:40) [23]
> просто так (10.03.09 14:24) [21]
мне без разницы, в каком порядке срабатывают секции инициализации разных модулей - плохо что процедура из модуля как-то вызывается до его инициализации :-(
← →
Palladin © (2009-03-10 14:45) [24]Я тебе сказал начни с F7, а не F9, и посмотри в какую процедуру инициализации зайдет ход исполнения. Третий раз повторить? Или чего?
← →
IGray (2009-03-10 15:03) [25]Не надо повторять :-)
Сорри, что не написал здесь, просто результат этого эксперимента был отрицательный :(
F7 показывает, что управление передаётся сначала секции инициализации модуля Б, потом из этой секции вызывается процедура из модуля А. Секция инициализации модуля А вызывается ПОЗЖЕ всего этого, а хотелось бы - ДО
В общем всё как я писал ранее..
← →
Anatoly Podgoretsky © (2009-03-10 15:05) [26]> IGray (10.03.2009 14:37:22) [22]
Это распространяется на приведенное правило, как ты справедливо заметил мое, поскольку во время срабатывания секций INITIALIZATION еще не все секции инициализированы. Отсюда могут быть проблемы.
← →
Anatoly Podgoretsky © (2009-03-10 15:06) [27]> Palladin (10.03.2009 14:45:24) [24]
Ну найдет и что, а в другой раз будет другой порядок и что так постоянно и бегать?
← →
Palladin © (2009-03-10 15:09) [28]
> IGray (10.03.09 15:03) [25]
циркуляр референсы вообще штуки вредные и нужно от них избавлятся. ну а по поводу твоей проблемы, попробуй поменять uses местами в одном из interface в implementation, в другом соответственно наоборот.
← →
IGray (2009-03-10 15:28) [29]Дело в том, что конкретно ДАННАЯ проблема для меня не критична, я могу её как-нибудь обойти, но я не хочу внезапно напороться на такое поведение позже, в гораздо более ответственном месте.
Т.е. я не столько хочу исправить данный баг, сколько разобраться КАК ТАКОЕ ВООБЩЕ ВОЗМОЖНО...
Спасибо всем кто помогает!
← →
Palladin © (2009-03-10 15:39) [30]Это все понятно. Ты попробовал сделать то что я написал?
← →
KSergey © (2009-03-10 16:00) [31]не надо делать так, как писал Palladin, хоть он и мастер.
завтра подобная трабла всплывет в дугом месте.
Надо передизайнить проект так, чтобы такой дури не было. Что думают создатели VCL о своем детище в этом разрезе - мне плевать. У них работает.
← →
IGray (2009-03-10 16:13) [32]В настоящий момент модуль А ссылается только на стандартные модули, тем не менее проблема осталась..
← →
clickmaker © (2009-03-10 16:21) [33]если из секции инициализации Б вызывается процедура А до секции инициализации А, значит Б в проекте выше, чем А.
← →
Германн © (2009-03-11 01:33) [34]
> IGray (10.03.09 16:13) [32]
Имхо, нужно купить и изучить учебник.
Ну не может процедура начать выполнение, пока другая процедура того же потока не закончилась.
← →
Palladin © (2009-03-11 08:05) [35]
> KSergey © (10.03.09 16:00) [31]
Я посоветовал по возможности избавиться от циркуляр референсе. Если от этого избавиться ему не предоставляется возможности (но как видно из ответа очень даже возможно) то поменять места определений. А в VCL нет в секции initialization вызовов к другому модулю который так же использует этот.
← →
KSergey © (2009-03-11 09:13) [36]> IGray (10.03.09 16:13) [32]
> В настоящий момент модуль А ссылается только на стандартные модули, тем не менее проблема осталась..
Какая?
Уже же сказано: надо передизайнить так, чтобы инициализация одного модуля (и вызываемые из нее функции!) не зависели от инициализации других модулей ВООБЩЕ!
Ибо такая ситуация будет все время бить по ногам, сегодня ее решить удасться, а завтра снова на нее наткнемся.
← →
IGray (2009-03-11 13:16) [37]Всем спасибо! Пока у меня утром глючил инет, я и сам кажется въехал..
Похоже правильный ответ звучит так:
"Два и более модулей имеющих секции инициализации не должны прямо либо косвенно циклически ссылаться друг на друга"
В противном случае у компилятора "едет крыша", т.к. процесс поиска правильной последовательности инициализации как бы зацикливается, что приводит к описанному в вопросе эффекту, причём никаких предупреждений компилятор не выдаёт (а ведь мог бы).
Прошу прощения за ошибочную информацию в посте
> IGray (10.03.09 16:13) [32]
> В настоящий момент модуль А ссылается только на стандартные модули, тем не менее проблема осталась..
Не знаю как это вышло, но я недоперекомпилировал проект :-(
После полнейшей перекомпиляции проблема исчезла, т.е. дело было только в вышеуказанном.
> чтобы инициализация одного модуля (и вызываемые из нее
> функции!) не зависели от инициализации других модулей ВООБЩЕ!
Думаю это уже слишком, т.к. инициализация модулей БЕЗ циркулярных референсов выполняется совершенно спокойно и однозначно...
Ещё раз всем спасибо за участие в моей проблеме!
Кстати, знает ли кто-нибудь более-менее удобное средство визуализации зависимостей между модулями проекта?
← →
Palladin © (2009-03-11 13:20) [38]зависит от требований к этому "более-менее" :) меня и вот ModelMaker устраивает... Розыч тут чего то ваял, но результатами так и не похвастался :)
← →
Rouse_ © (2009-03-11 13:40) [39]Не скажу что у меня прямтаки удобное, я его просто банально не довел до конца, т.к. нет времени, а по моим прикидкам чтобы довести это дело до ума нужно месяца три.
Для работы использовали эту утилитку несколько раз чтоб понять откуда ноги растут у того или иного модуля, нам в принципе для небольшого рефакторинга хватило.
Воть: 1.4Мб
http://rouse.drkb.ru/other/unitweb.zip
← →
Rouse_ © (2009-03-11 13:46) [40]Ну и картиночка: http://rouse.drkb.ru/other/uw.gif
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2010.02.14;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.006 c