Автор Тема: [BlackBox] Динамическая выгрузка/загрузка.  (Прочитано 23638 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Задача следующая: вот допустим у меня есть стандартный пример Cubes (Obx/Docu/Cubes.odc), который соответственно умеет размещать свой Action и свой View, причем этот самый View уже допустим внедрен в какой-то составной документ и там благополучно вращается.

Я хочу иметь возможность модифицировать код этого модуля ObxCubes (например менять его поведение, чтобы например он не вращался а перемещался, логику менять, возможно отрисовку) на лету. То есть чтобы во внедренном в составной документ View сразу отображались изменения (скажем куб перестал вращаться, или вообще в шар превратился).

То есть такой вот hot code swapping.

Это возможно?

PS. В erlang'e я это делал неоднократно - там это элементарно делается.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #1 : Май 08, 2013, 12:55:15 pm »
Сделай переменные-параметры (скорость например) экспортными в модуле и создай форму для этого модуля.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #2 : Май 08, 2013, 01:38:24 pm »
Сделай переменные-параметры (скорость например) экспортными в модуле и создай форму для этого модуля.
Не катит. Мне нужно менять алгоритмы. Причем я меняю тот алгоритм который есть на тот о котором во момент написания модуля я ничего не знаю.

То есть мне нужен реальный hot code swapping, не покрывающийся конфигами.

Еще пример - мне нужно в этом модуле пофиксить багу. Фиксить нужно без (видимой)остановки работы приложения.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #3 : Май 08, 2013, 03:25:08 pm »
В любом случае делаешь экспортную переменную и ее меняешь во время работы.
Пусть в этой переменной будет реализация некого класса. Вот и подменяй эту реализацию динамически.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #4 : Май 08, 2013, 03:41:50 pm »
В любом случае делаешь экспортную переменную и ее меняешь во время работы.
Пусть в этой переменной будет реализация некого класса. Вот и подменяй эту реализацию динамически.

Это ручной code swapping. А он хочет из черной коробки :)

kkk

  • Гость
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #5 : Май 09, 2013, 09:42:50 am »
Не как в эрланге

DddIzer

  • Гость
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #6 : Май 09, 2013, 10:52:10 am »
Сделай переменные-параметры (скорость например) экспортными в модуле и создай форму для этого модуля.
Не катит. Мне нужно менять алгоритмы. Причем я меняю тот алгоритм который есть на тот о котором во момент написания модуля я ничего не знаю.

То есть мне нужен реальный hot code swapping, не покрывающийся конфигами.

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

DddIzer

  • Гость
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #7 : Май 09, 2013, 11:18:26 am »
.. также вроде ничто не  мешает действовать по следующей схеме
 пусть есть модуль А ( который экспортирует тип процедуры прорисовки,  дефолтную процедуру прорисовки и глобальную процедурную переменную указывающую на текущую процедуру прорисовки), Модуль Б - который вызывает текущую процедуру прорисовки , и модуль C. которыq

DddIzer

  • Гость
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #8 : Май 09, 2013, 11:23:43 am »
.. также вроде ничто не  мешает действовать по следующей схеме
 пусть есть модуль А ( который экспортирует тип процедуры прорисовки,  дефолтную процедуру прорисовки и глобальную процедурную переменную Proc указывающую на текущую процедуру прорисовки - при загрузке A устанавливает в Proc - дефолтную процедуру прорисовки), Модуль Б - который вызывает текущую процедуру прорисовки (например по таймеру) , и модуль C. который при загрузки  подменяет дефолтную процедуру прорисовки (из А) своей, а при выгрузке присваивает переменной Proc дефолтное значение

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #9 : Май 09, 2013, 12:05:30 pm »
Сделать, допустим, общую штуку - вьюшку-обёртку, которая понимает сообщение ReloadMsg - сериализует свою внутреннюю вьюшку (в Files.dir.Temp()), выгружает её модуль, делает загрузку вьюшки из временного представления (при этом модуль автоматом загрузится в новой версии) и помещает внутрь себя уже новую вьюшку.

kkk

  • Гость
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #10 : Май 09, 2013, 01:59:01 pm »
Веселовский, вы же профессионал, неужели не разобрались сами?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #11 : Май 09, 2013, 06:21:44 pm »
Веселовский, вы же профессионал, неужели не разобрались сами?
Именно потому что профессионал, не исключаю возможность своей ошибки, и поэтому не считаю зазорным посоветоваться с другими и не боюсь показаться глупым.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #12 : Май 09, 2013, 06:24:21 pm »
.. также вроде ничто не  мешает действовать по следующей схеме
 пусть есть модуль А ( который экспортирует тип процедуры прорисовки,  дефолтную процедуру прорисовки и глобальную процедурную переменную Proc указывающую на текущую процедуру прорисовки - при загрузке A устанавливает в Proc - дефолтную процедуру прорисовки), Модуль Б - который вызывает текущую процедуру прорисовки (например по таймеру) , и модуль C. который при загрузки  подменяет дефолтную процедуру прорисовки (из А) своей, а при выгрузке присваивает переменной Proc дефолтное значение

Сделать, допустим, общую штуку - вьюшку-обёртку, которая понимает сообщение ReloadMsg - сериализует свою внутреннюю вьюшку (в Files.dir.Temp()), выгружает её модуль, делает загрузку вьюшки из временного представления (при этом модуль автоматом загрузится в новой версии) и помещает внутрь себя уже новую вьюшку.

Спасибо. Понял. Значит в общем случае в ББ задача не решена, но для моего конкретного случая вполне сгодится старый добрый ручной метод. Попробую.
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #13 : Май 09, 2013, 08:44:26 pm »
в общем - не общем, но возможности те же или почти те же, что и в эрланге.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #14 : Май 09, 2013, 09:49:39 pm »
в общем - не общем, но возможности те же или почти те же, что и в эрланге.
Сори, но ничего общего не наблюдаю. Возможности тут примерно те же, что в Сях с динамическими либами.

В ерланге я могу заменить любой модуль на лету, в том числе тот который сейчас активно используется другими модулями. Все это без остановки системы.
Y = λf.(λx.f (x x)) (λx.f (x x))