![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Очень странное срабатывание секции INITIALIZATION
IGray © (2009-03-10 12:16:00)Есть модуль. В нём одна процедура и секция инициализации.
Ставлю точки остановки на первую строчку в процедуре и первую строчку секции инициализации. Запускаю (F9).
Управление сначала попадает В ПРОЦЕДУРУ!!! И только потом - В СЕКЦИЮ ИНИЦИАЛИЗАЦИИ!
Вопрос: как такое вообще возможно?? В какой ситуации???
Не сообщаю дополнительные обстоятельства потому, что не могу понять, какие из них существенны...
Считал, что секция инициализации по определению вызывается первой ВСЕГДА!
Очень интересно мнение профессионалов!
Palladin (2009-03-11 13:20:00) [21]зависит от требований к этому "более-менее" :) меня и вот ModelMaker устраивает... Розыч тут чего то ваял, но результатами так и не похвастался :)
IGray (2009-03-11 13:16:00) [22]Всем спасибо! Пока у меня утром глючил инет, я и сам кажется въехал..
Похоже правильный ответ звучит так:
"Два и более модулей имеющих секции инициализации не должны прямо либо косвенно циклически ссылаться друг на друга"
В противном случае у компилятора "едет крыша", т.к. процесс поиска правильной последовательности инициализации как бы зацикливается, что приводит к описанному в вопросе эффекту, причём никаких предупреждений компилятор не выдаёт (а ведь мог бы).
Прошу прощения за ошибочную информацию в посте
> IGray (10.03.09 16:13) [32]
> В настоящий момент модуль А ссылается только на стандартные модули, тем не менее проблема осталась..
Не знаю как это вышло, но я недоперекомпилировал проект :-(
После полнейшей перекомпиляции проблема исчезла, т.е. дело было только в вышеуказанном.
> чтобы инициализация одного модуля (и вызываемые из нее
> функции!) не зависели от инициализации других модулей ВООБЩЕ!
Думаю это уже слишком, т.к. инициализация модулей БЕЗ циркулярных референсов выполняется совершенно спокойно и однозначно...
Ещё раз всем спасибо за участие в моей проблеме!
Кстати, знает ли кто-нибудь более-менее удобное средство визуализации зависимостей между модулями проекта?
KSergey (2009-03-11 09:13:00) [23]> IGray (10.03.09 16:13) [32]
> В настоящий момент модуль А ссылается только на стандартные модули, тем не менее проблема осталась..
Какая?
Уже же сказано: надо передизайнить так, чтобы инициализация одного модуля (и вызываемые из нее функции!) не зависели от инициализации других модулей ВООБЩЕ!
Ибо такая ситуация будет все время бить по ногам, сегодня ее решить удасться, а завтра снова на нее наткнемся.
Palladin (2009-03-11 08:05:00) [24]
> KSergey © (10.03.09 16:00) [31]
Я посоветовал по возможности избавиться от циркуляр референсе. Если от этого избавиться ему не предоставляется возможности (но как видно из ответа очень даже возможно) то поменять места определений. А в VCL нет в секции initialization вызовов к другому модулю который так же использует этот.
Германн (2009-03-11 01:33:00) [25]
> IGray (10.03.09 16:13) [32]
Имхо, нужно купить и изучить учебник.
Ну не может процедура начать выполнение, пока другая процедура того же потока не закончилась.
clickmaker (2009-03-10 16:21:00) [26]если из секции инициализации Б вызывается процедура А до секции инициализации А, значит Б в проекте выше, чем А.
IGray (2009-03-10 16:13:00) [27]В настоящий момент модуль А ссылается только на стандартные модули, тем не менее проблема осталась..
KSergey (2009-03-10 16:00:00) [28]не надо делать так, как писал Palladin, хоть он и мастер.
завтра подобная трабла всплывет в дугом месте.
Надо передизайнить проект так, чтобы такой дури не было. Что думают создатели VCL о своем детище в этом разрезе - мне плевать. У них работает.
Palladin (2009-03-10 15:39:00) [29]Это все понятно. Ты попробовал сделать то что я написал?
IGray (2009-03-10 15:28:00) [30]Дело в том, что конкретно ДАННАЯ проблема для меня не критична, я могу её как-нибудь обойти, но я не хочу внезапно напороться на такое поведение позже, в гораздо более ответственном месте.
Т.е. я не столько хочу исправить данный баг, сколько разобраться КАК ТАКОЕ ВООБЩЕ ВОЗМОЖНО...
Спасибо всем кто помогает!
Palladin (2009-03-10 15:09:00) [31]
> IGray (10.03.09 15:03) [25]
циркуляр референсы вообще штуки вредные и нужно от них избавлятся. ну а по поводу твоей проблемы, попробуй поменять uses местами в одном из interface в implementation, в другом соответственно наоборот.
Anatoly Podgoretsky (2009-03-10 15:06:00) [32]> Palladin (10.03.2009 14:45:24) [24]
Ну найдет и что, а в другой раз будет другой порядок и что так постоянно и бегать?
Anatoly Podgoretsky (2009-03-10 15:05:00) [33]> IGray (10.03.2009 14:37:22) [22]
Это распространяется на приведенное правило, как ты справедливо заметил мое, поскольку во время срабатывания секций INITIALIZATION еще не все секции инициализированы. Отсюда могут быть проблемы.
IGray (2009-03-10 15:03:00) [34]Не надо повторять :-)
Сорри, что не написал здесь, просто результат этого эксперимента был отрицательный :(
F7 показывает, что управление передаётся сначала секции инициализации модуля Б, потом из этой секции вызывается процедура из модуля А. Секция инициализации модуля А вызывается ПОЗЖЕ всего этого, а хотелось бы - ДО
В общем всё как я писал ранее..
Palladin (2009-03-10 14:45:00) [35]Я тебе сказал начни с F7, а не F9, и посмотри в какую процедуру инициализации зайдет ход исполнения. Третий раз повторить? Или чего?
IGray (2009-03-10 14:40:00) [36]
> просто так (10.03.09 14:24) [21]
мне без разницы, в каком порядке срабатывают секции инициализации разных модулей - плохо что процедура из модуля как-то вызывается до его инициализации :-(
IGray (2009-03-10 14:37:00) [37]
> Как же не имел, а что тогда плачешь?
Не имел раньше, хотя использовал часто...
Интересно, а на процедуры из стандартных дельфийских модулей согласно Вашему правилу, ссылаться можно?
просто так (2009-03-10 14:24:00) [38]Будет отличаться порядок вызова секций INITIALIZATION разных модулей соответственно и работоспособность
Anatoly Podgoretsky (2009-03-10 14:19:00) [39]> просто так (10.03.2009 14:17:18) [18]
Порядок не будет отличаться, а рабоспособность будет.
Anatoly Podgoretsky (2009-03-10 14:17:00) [40]> IGray (10.03.2009 14:08:14) [14]
Как же не имел, а что тогда плачешь?