Конференция "Основная" » Очень странное срабатывание секции INITIALIZATION
 
  • IGray (10.03.09 12:16) [0]
    Есть модуль. В нём одна процедура и секция инициализации.
    Ставлю точки остановки на первую строчку в процедуре и первую строчку секции инициализации. Запускаю (F9).
    Управление сначала попадает В ПРОЦЕДУРУ!!! И только потом - В СЕКЦИЮ ИНИЦИАЛИЗАЦИИ!

    Вопрос: как такое вообще возможно?? В какой ситуации???

    Не сообщаю дополнительные обстоятельства потому, что не могу понять, какие из них существенны...

    Считал, что секция инициализации по определению вызывается первой ВСЕГДА!

    Очень интересно мнение профессионалов!
  • clickmaker © (10.03.09 12:19) [1]
    > Управление сначала попадает В ПРОЦЕДУРУ!!! И только потом
    > - В СЕКЦИЮ ИНИЦИАЛИЗАЦИИ!

    а процедура-то откуда вызывается? не из секции инициализации? -)
  • IGray (10.03.09 12:36) [2]
    Вызывается из секции инициализации ДРУГОГО модуля.
    А даже если б из этого - как это объясняет, что управление сначала попадает в процедуру, и лишь потом - на ПЕРВУЮ строчку секции инициализации? Я в недоумении..

    P.S. Юзаю Delphi7
  • clickmaker © (10.03.09 12:38) [3]
    > [2] IGray   (10.03.09 12:36)
    > Вызывается из секции инициализации ДРУГОГО модуля.

    а модули в каком порядке в файле проекта?
  • IGray (10.03.09 12:46) [4]
    Сорри, а какая разница?
    Если процедура из модуля А вызывается из секции инициализации модуля Б, то это значит, что модуль А указан в списке USES модуля Б, и по-любому секция инициализации модуля А должна ведь была сработать первой...

    Мож это какой-то известный баг Дельфи?
  • Anatoly Podgoretsky © (10.03.09 12:49) [5]
    > IGray  (10.03.2009 12:16:00)  [0]

    Код нужен и описание, что и когда вызывается, но видимо ты что то путаешь, инициализацию не требуется вызывать.
  • Palladin © (10.03.09 12:49) [6]
    Начни не по F9, а по F7 и посмотри, что начинает исполнятся
  • IGray (10.03.09 13:16) [7]

    > инициализацию не требуется вызывать

    Сорри, в каком смысле? Поясните свою мысль пожалуйста.
    До инициализации модуля А процедура в нём не работает правильно...

    На самом деле проект крупный, много модулей и кода, поэтому здесь выложить сложно.. Но я пока не понимаю, как это может повлиять на суть вопроса...

    Проект скомпилирован с опцией "Build with Run-Time packages"
  • Anatoly Podgoretsky © (10.03.09 13:19) [8]
    > IGray  (10.03.2009 12:36:02)  [2]

    Секции инициализации не должны вызывать процедуры из других модулей, явно или косвенно.
  • Anatoly Podgoretsky © (10.03.09 13:19) [9]
    > clickmaker  (10.03.2009 12:38:03)  [3]

    Я легко обеспечу кросс зависимость.
  • Дмитрий Белькевич © (10.03.09 13:30) [10]
    >На самом деле проект крупный, много модулей и кода, поэтому здесь выложить сложно.

    Тестовый пример делай, как проявляется проблема. Может и сам поймёшь почему, а нет - то всем покажешь.

    А так - только гадание на гуще.

    Так же разумно включить компиляцию с дебажными либами и посмотреть колл-стэки, кто что и когда вызывает.
  • Riply © (10.03.09 13:54) [11]
    > [8] Anatoly Podgoretsky ©   (10.03.09 13:19)
    > Секции инициализации не должны вызывать процедуры из других модулей, явно или косвенно.

    Это ээээ... пуленепробиваемое правило, или от него, иногда, можно отступать ?
  • Дмитрий Белькевич © (10.03.09 13:57) [12]
    Можно отступать, вообще, от многого. Главное - что бы потом не биться головой об стену в поисках ошибки, как ТС.
  • Palladin © (10.03.09 14:00) [13]

    > Riply ©   (10.03.09 13:54) [11]

    Это правило Анатоля и чем дальше ты от него, тем безопасней не следовать этому правилу. :)
  • IGray (10.03.09 14:08) [14]

    > Секции инициализации не должны вызывать процедуры из других
    > модулей, явно или косвенно.

    А вот это интересно, так как это реально ново для меня. Раньше этому правилу никогда не следовал и проблем не имел. Можете ли обосновать свою мысль?


    > Тестовый пример делай

    Похоже, этого не избежать, спасибо!
  • Palladin © (10.03.09 14:13) [15]

    > А вот это интересно, так как это реально ново для меня.

    Я думаю, что это реально ново и для борланда, вот они удивятся :) Ведь добрая часть VCL не следует правилу Анатоля! :)
  • просто так (10.03.09 14:13) [16]
    модули циклически ссылаются друг на друга interface - implementation
  • Anatoly Podgoretsky © (10.03.09 14:16) [17]
    > Riply  (10.03.2009 13:54:11)  [11]

    Можно, когда есть увереность.
  • просто так (10.03.09 14:17) [18]
    + >>Секции инициализации не должны вызывать процедуры из других модулей, явно или косвенно.
    тогда порядок INITIALIZATION будет отличаться от задуманного
  • Anatoly Podgoretsky © (10.03.09 14:17) [19]
    > IGray  (10.03.2009 14:08:14)  [14]

    Как же не имел, а что тогда плачешь?
  • Anatoly Podgoretsky © (10.03.09 14:19) [20]
    > просто так  (10.03.2009 14:17:18)  [18]

    Порядок не будет отличаться, а рабоспособность будет.
  • просто так (10.03.09 14:24) [21]
    Будет отличаться порядок вызова секций INITIALIZATION разных модулей соответственно и работоспособность
  • IGray (10.03.09 14:37) [22]

    > Как же не имел, а что тогда плачешь?

    Не имел раньше, хотя использовал часто...
    Интересно, а на процедуры из стандартных дельфийских модулей согласно Вашему правилу, ссылаться можно?
  • IGray (10.03.09 14:40) [23]

    > просто так   (10.03.09 14:24) [21]

    мне без разницы, в каком порядке срабатывают секции инициализации разных модулей - плохо что процедура из модуля как-то вызывается до его инициализации :-(
  • Palladin © (10.03.09 14:45) [24]
    Я тебе сказал начни с F7, а не F9, и посмотри в какую процедуру инициализации зайдет ход исполнения. Третий раз повторить? Или чего?
  • IGray (10.03.09 15:03) [25]
    Не надо повторять :-)
    Сорри, что не написал здесь, просто результат этого эксперимента был отрицательный :(
    F7 показывает, что управление передаётся сначала секции инициализации модуля Б, потом из этой секции вызывается процедура из модуля А. Секция инициализации модуля А вызывается ПОЗЖЕ всего этого, а хотелось бы - ДО
    В общем всё как я писал ранее..
  • Anatoly Podgoretsky © (10.03.09 15:05) [26]
    > IGray  (10.03.2009 14:37:22)  [22]

    Это распространяется на приведенное правило, как ты справедливо заметил мое, поскольку во время срабатывания секций INITIALIZATION еще не все секции инициализированы. Отсюда могут быть проблемы.
  • Anatoly Podgoretsky © (10.03.09 15:06) [27]
    > Palladin  (10.03.2009 14:45:24)  [24]

    Ну найдет и что, а в другой раз будет другой порядок и что так постоянно и бегать?
  • Palladin © (10.03.09 15:09) [28]

    > IGray   (10.03.09 15:03) [25]

    циркуляр референсы вообще штуки вредные и нужно от них избавлятся. ну а по поводу твоей проблемы, попробуй поменять uses местами в одном из interface в implementation, в другом соответственно наоборот.
  • IGray (10.03.09 15:28) [29]
    Дело в том, что конкретно ДАННАЯ проблема для меня не критична, я могу её как-нибудь обойти, но я не хочу внезапно напороться на такое поведение позже, в гораздо более ответственном месте.

    Т.е. я не столько хочу исправить данный баг, сколько разобраться КАК ТАКОЕ ВООБЩЕ ВОЗМОЖНО...

    Спасибо всем кто помогает!
  • Palladin © (10.03.09 15:39) [30]
    Это все понятно. Ты попробовал сделать то что я написал?
  • KSergey © (10.03.09 16:00) [31]
    не надо делать так, как писал Palladin, хоть он и мастер.
    завтра подобная трабла всплывет в дугом месте.

    Надо передизайнить проект так, чтобы такой дури не было. Что думают создатели VCL о своем детище в этом разрезе - мне плевать. У них работает.
  • IGray (10.03.09 16:13) [32]
    В настоящий момент модуль А ссылается только на стандартные модули, тем не менее проблема осталась..
  • clickmaker © (10.03.09 16:21) [33]
    если из секции инициализации Б вызывается процедура А до секции инициализации А, значит Б в проекте выше, чем А.
  • Германн © (11.03.09 01:33) [34]

    > IGray   (10.03.09 16:13) [32]

    Имхо, нужно купить и изучить учебник.
    Ну не может процедура начать выполнение, пока другая процедура того же потока не закончилась.
  • Palladin © (11.03.09 08:05) [35]

    > KSergey ©   (10.03.09 16:00) [31]

    Я посоветовал по возможности избавиться от циркуляр референсе. Если от этого избавиться ему не предоставляется возможности (но как видно из ответа очень даже возможно) то поменять места определений. А в VCL нет в секции initialization вызовов к другому модулю который так же использует этот.
  • KSergey © (11.03.09 09:13) [36]
    > IGray   (10.03.09 16:13) [32]
    > В настоящий момент модуль А ссылается только на стандартные модули, тем не менее проблема осталась..

    Какая?
    Уже же сказано: надо передизайнить так, чтобы инициализация одного модуля (и вызываемые из нее функции!) не зависели от инициализации других модулей ВООБЩЕ!
    Ибо такая ситуация будет все время бить по ногам, сегодня ее решить удасться, а завтра снова на нее наткнемся.
  • IGray (11.03.09 13:16) [37]
    Всем спасибо! Пока у меня утром глючил инет, я и сам кажется въехал..
    Похоже правильный ответ звучит так:
    "Два и более модулей имеющих секции инициализации не должны прямо либо косвенно циклически ссылаться друг на друга"
    В противном случае у компилятора "едет крыша", т.к. процесс поиска правильной последовательности инициализации как бы зацикливается, что приводит к описанному в вопросе эффекту, причём никаких предупреждений компилятор не выдаёт (а ведь мог бы).

    Прошу прощения за ошибочную информацию в посте

    > IGray   (10.03.09 16:13) [32]
    > В настоящий момент модуль А ссылается только на стандартные модули, тем не менее проблема осталась..


    Не знаю как это вышло, но я недоперекомпилировал проект :-(
    После полнейшей перекомпиляции проблема исчезла, т.е. дело было только в вышеуказанном.


    >  чтобы инициализация одного модуля (и вызываемые из нее
    > функции!) не зависели от инициализации других модулей ВООБЩЕ!


    Думаю это уже слишком, т.к. инициализация модулей БЕЗ циркулярных референсов выполняется совершенно спокойно и однозначно...

    Ещё раз всем спасибо за участие в моей проблеме!

    Кстати, знает ли кто-нибудь более-менее удобное средство визуализации зависимостей между модулями проекта?
  • Palladin © (11.03.09 13:20) [38]
    зависит от требований к этому "более-менее" :) меня и вот ModelMaker устраивает... Розыч тут чего то ваял, но результатами так и не похвастался :)
  • Rouse_ © (11.03.09 13:40) [39]
    Не скажу что у меня прямтаки удобное, я его просто банально не довел до конца, т.к. нет времени, а по моим прикидкам чтобы довести это дело до ума нужно месяца три.
    Для работы использовали эту утилитку несколько раз чтоб понять откуда ноги растут у того или иного модуля, нам в принципе для небольшого рефакторинга хватило.
    Воть: 1.4Мб
    http://rouse.drkb.ru/other/unitweb.zip
  • Rouse_ © (11.03.09 13:46) [40]
    Ну и картиночка: http://rouse.drkb.ru/other/uw.gif
  • IGray (11.03.09 14:31) [41]
    Спасибо! Очень любопытная тулзовина!
    Жаль, что мой проект не переварила...
    За инфу про ModelMaker тоже спасибо!
  • Servy © (11.03.09 14:40) [42]
    > Не скажу что у меня прямтаки удобное, я его просто банально
    > не довел до конца, т.к. нет времени, а по моим прикидкам
    > чтобы довести это дело до ума нужно месяца три.
    > Для работы использовали эту утилитку несколько раз чтоб
    > понять откуда ноги растут у того или иного модуля, нам в
    > принципе для небольшого рефакторинга хватило.
    > Воть: 1.4Мб
    > http://rouse.drkb.ru/other/unitweb.zip


    У меня почему-то не работает :(. "List index out of bounds (-1)" после открытия любого dpr'а, в частности самого простого с одной формой, специально созданного для этого в Delphi 7. И никаких графиков и списков как на скриншоте не появляется. С какой стороны подкрутить, чтобы заработало? ^^
  • Rouse_ © (11.03.09 14:53) [43]
    А она умеет только от 2006-ой дельфи и выше проекты кушать :)
  • Rouse_ © (11.03.09 14:55) [44]
    Если кому нужно будет - то в могу чуть подправить и выложить полностью с исходниками. Дома в принципе семерка стоит, под нее можно будет допилить...
  • Riply © (11.03.09 15:22) [45]
    > [44] Rouse_ ©   (11.03.09 14:55)
    > Если кому нужно будет - то в могу чуть подправить и выложить полностью с исходниками.

    "Надо, Саша, надо" (с) Почти дословная :)
    Очень надо.
    Пару дней назад прижало и сама начала писать что-то типа dpr - "парсилки".
    А тут такая удача. Так что давай "подправляй и выкладывай полностью с исходниками".
    :)
  • Rouse_ © (11.03.09 15:35) [46]
    Надо, значит допилю :)
  • Riply © (11.03.09 15:37) [47]
    > [45] Riply ©   (11.03.09 15:22)

    Сейчас у меня даже получение списка файлов проекта
    до конца не реализовано. Споткнулась на конструкциях типа:

    {$IFDEF SOME_CONDITION}
    {$INCLUDE ..\..\..\MySuperPuper.pas}
    {$ENDIF}

    т.к. еще не научилась определять "продефайнено" ли здесь(в данном месте данного юнита) SOME_CONDITION или нет.
  • Rouse_ © (11.03.09 15:44) [48]
    Я тебе краткое направление дам - сначала определи все дефайны проекта, включая глобальные, потом определи места откуда до кода дефайн включен, потом вычисти все комментарии в тексте, при этом важно отличать дефайн от комментария типа {}, потом удали весь текст в выключеных дефайнах и после этого получишь чистый текстовик который можно элементарно парсить..

    У меня все это чиститься за исключением вот таких конструкций:
       {$IF Defined(DEBUG) and Defined(LINUX)} bla..bla {$IFEND}
       {$IF sizeof(Integer) = 4} bla..bla {$IFEND}
       (*$DEFINE TEST *)
       (*$IFDEF TEST *) bla..bla (*$ENDIF*)

  • Riply © (11.03.09 15:54) [49]
    > [48] Rouse_ ©   (11.03.09 15:44)
    > Я тебе краткое направление дам

    Спасибо :)
    Но я пока повременю в бой бросатmся - подожду твоих исходников :)
  • Rouse_ © (11.03.09 16:09) [50]
    Стукни в аську, в профиле - так проще будет, вдвоем быстрее доведем, а то я в одиночку неделю телепаться буду, если не больше :)
  • Игорь Шевченко © (11.03.09 16:14) [51]
    Jedi Code Formatter с исходниками - рулез фарева. Там готовый парсер
  • Palladin © (11.03.09 16:15) [52]
    Удалено модератором
    Примечание: больше не буду
  • Anatoly Podgoretsky © (11.03.09 19:44) [53]
    > Rouse_  (11.03.2009 16:09:50)  [50]

    Налицо сговор, один пилит, а вторая допиливает :0)
  • Дмитрий Белькевич © (11.03.09 22:47) [54]
    Как всё таки насчет того, что бы колл-стэк посмотреть? С включенными дебажными либами?
  • IGray (11.03.09 23:41) [55]
    Кол-стек в какой точке?
    На какой вопрос Вы ищете ответ?
    Я со своим вроде разобрался.. см. IGray  (11.03.09 13:16) [37]
    Если нужно - поясню подробнее.
  • Дмитрий Белькевич © (11.03.09 23:56) [56]
    >Думаю это уже слишком, т.к. инициализация модулей БЕЗ циркулярных референсов выполняется совершенно спокойно и однозначно...

    Увидел.
  • Тын-Дын © (12.03.09 15:15) [57]

    > Считал, что секция инициализации по определению вызывается
    > первой ВСЕГДА!


    Естественно всегда!

    Но если в проекте несколько модулей, в каждом есть секция инициализации, то все эти секции выполняются в порядке указания модулей в USES.
    Соответственно, если в секции инициализации одного модуля вызывается некая процедура(из этого модуля или из другого - неважно), то эта процедура выполнится до того, как начнётся выполняться инициализация следующих по порядку модулей.

    Вроде бы здесь всё логично и вопросо не должно возникать?
  • SPeller © (18.03.09 07:52) [58]
    Если в функцию (функции) вставить условие
    if not RoutineInitialized then
      InitializeRoutine;


    то можно избавиться вообще от секции инициализации и не париться про порядок вызова оных при старте. Если не охота плодить условия в функциях, то можно эти 2 строки вынести во внутреннюю функцию и вызывать уже ее. Лишняя строка читабельность кода не повредит.
 
Конференция "Основная" » Очень странное срабатывание секции INITIALIZATION
Есть новые Нет новых   [118656   +18][b:0][p:0.002]