Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1260276252
NailMan
2009-12-08 15:44
2010.02.14
Нужна помошь линуксоидов в написании части скрипта


15-1259621251
Германн
2009-12-01 01:47
2010.02.14
А есть ли тут "Мастера ПИД регуляторов"?


15-1260135019
Юрий
2009-12-07 00:30
2010.02.14
С днем рождения ! 7 декабря 2009 понедельник


15-1259953459
KilkennyCat
2009-12-04 22:04
2010.02.14
какую библиотеку Ajax предпочитаете?


2-1260872714
Андрей_11
2009-12-15 13:25
2010.02.14
Combobox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский