A2 & Oberon » Программирование » Общеe » SystemTools.Free

Страниц (2): [1] 2 »
 

1. lit-uriy - 05 Января, 2009 - 03:39:44 - перейти к сообщению
Не знаю в какой топик уместнее, ну пусть будет здесь.
Есть модуль (тот что привел sage )

Скомпилировал, запустил ( щелкнул колесиком по тексту GUIPat2.Open ~), побаловался. Нажал крестик на окошке - окошко исчезло.

Опять щелкаю по этому тексту, эфекта нет. Пока не щелкну по такому тексту:
SystemTools.Free GUIPat2 ~
тогда можно будет опять запускать.


Вопросы:
1) Что происходит, когда нажимаю крестик на окошке?
2) Что происходит, когда щедкаю текст SystemTools.Free GUIPat2 ~?
2. neuf - 05 Января, 2009 - 08:50:49 - перейти к сообщению
lit-uriy пишет:

1) Что происходит, когда нажимаю крестик на окошке?

При этом закрывается окно формы, но модуль остается в памяти.
lit-uriy пишет:

Опять щелкаю по этому тексту, эфекта нет.

В GUIPat2.Open есть такой фрагмент:

IF winstance = NIL THEN
NEW (winstance);
END;

Если существует экземпляр winstance, новый не создастся.
lit-uriy пишет:

2) Что происходит, когда щедкаю текст SystemTools.Free GUIPat2 ~?

Вот здесь наконец модуль выгружается из памяти и можно запускать новый экземпляр окна.
3. lit-uriy - 05 Января, 2009 - 09:05:43 - перейти к сообщению
neuf пишет:
При этом закрывается окно формы.
это аналогично вызову
winstance.Close();
или нет?
И как в модуле отрегагировать на закрытие окна так чтобы SystemTools.Free GUIPat2 ~ можно было осуществить програмно?
4. sage - 05 Января, 2009 - 09:45:40 - перейти к сообщению
lit-uriy пишет:
это аналогично вызову
winstance.Close();
или нет?
аналогично.
lit-uriy пишет:
И как в модуле отрегагировать на закрытие окна так чтобы SystemTools.Free GUIPat2 ~ можно было осуществить програмно?
По-идее нужно сделать обработчик OnClose, в котором сделать:
winstance := NIL
5. BohdanT - 05 Января, 2009 - 10:59:26 - перейти к сообщению
lit-uriy пишет:
Опять щелкаю по этому тексту, эфекта нет. Пока не щелкну по такому тексту:

Напомню, что можно в PET нажать Ctrl+U, что бы выгрузить модуль открытый в текущем окне.
6. lit-uriy - 05 Января, 2009 - 11:09:46 - перейти к сообщению
sage пишет:
winstance := NIL
Хм, присваеваем указателю пустоту и получаем выгруженый модуль?
Это из-за утилизации (сборщиком мусора) так получается?
7. BohdanT - 05 Января, 2009 - 11:21:31 - перейти к сообщению
lit-uriy пишет:
Это из-за утилизации (сборщиком мусора) так получается?

Да, если на объект не кто не ссылается, то он никому не нужен - можно выгружать
8. lit-uriy - 05 Января, 2009 - 11:47:59 - перейти к сообщению
посидел подумал - не сходится у меня в голове.
Сборщик мусора утилизирует память занятую типом, на который указвает winstance.
а как быть с самим модулем?


И еще непонятны процессы происходящие при наличии графических компонентов.

Вот мои рассуждения:
1) по команде GUIPat2.Open ~ ОСька ищет скомпиленый модуль с именем GUIPat2 (видимо файл GUIPat2.obw)
2) найдя этот модуль загружает его в память и передает управление в тело (BEGIN модуля) - своеобразный конструктор модуля
3) затем ищет в нем процедуру Open (как я понял должна быть экспортируемой)
4) если процедура найдена управление передается ей
5) в процедуре если экземпляр типа Window еще не создан, то создается. На этом процедура завершается.

А вот обработка событий в гуях как происходит? Получается, что в каком-то из базовых типов, от которых унаследован Window, запускается отдельный поток обработки событий. Иного способа продолжать работать я невижу.
9. neuf - 05 Января, 2009 - 12:46:13 - перейти к сообщению
lit-uriy пишет:

Сборщик мусора утилизирует память занятую типом, на который указвает winstance.
а как быть с самим модулем?

Сам модуль остается в памяти до тех пор, пока не будет принудительно выгружен с помощью SystemTools.Free. Кстати, есть такая команда SystemTools.ListModules, она показывает, какие модули сейчас в памяти. Модуль загружается в память не только при непосредственном к нему обращении, но и тогда, когда загружается модуль, в котором в списке импорта прописан наш модуль. И не выгружается до тех пор, пока не выгружены все модули, зависимые от него. Если модуль перекомпилировать в то время, когда он уже загружен в память, то для того чтобы увидеть работу вновь скомпиленого, нужно предварительно выгрузить предыдущую его версию
lit-uriy пишет:
1) по команде GUIPat2.Open ~ ОСька ищет скомпиленый модуль с именем GUIPat2 (видимо файл GUIPat2.obw)

Да, причем GUIPat2.Obw создается при компиляции файла с любым именем, в котором стоит MODULE GUIPat2;
lit-uriy пишет:

2) найдя этот модуль загружает его в память и передает управление в тело (BEGIN модуля) - своеобразный конструктор модуля

Да, причем команды от BEGIN до END GUIPat2 выполняются только один раз при загрузке модуля в память
lit-uriy пишет:

3) затем ищет в нем процедуру Open (как я понял должна быть экспортируемой)

Не только экспортируемой, но либо быть без параметров (если ей не нужно передавать параметры при вызове), либо с context:Commands.Context в качестве параметра (если параметры нужны). В PET они выделяются красной или зеленой стрелкой у имени процедуры
lit-uriy пишет:

А вот обработка событий в гуях как происходит? Получается, что в каком-то из базовых типов, от которых унаследован Window, запускается отдельный поток обработки событий. Иного способа продолжать работать я невижу.

Да, так. Window в GUIPat2 является производным типом от WMWindowManager.Window, обработчику (Handle*) которого передаются события клавиатуры и мышки (ETH16074.pdf, п.5.5)
10. lit-uriy - 05 Января, 2009 - 14:56:29 - перейти к сообщению
neuf пишет:
Сам модуль остается в памяти до тех пор, пока не будет принудительно выгружен с помощью SystemTools.Free.
тогда получается, что единственный способ запустить программу заново, не прибегая к SystemTools.Free проверять если экземпляр существует, то отобразить его, иначе создать.

Или можно как-то иначе?

Просто тотже PET:
я щелкаю крестик - PET закрывается. Затем в файловом менеджере щелкаю файл *.Mod и PET опять запускается, хотя я предварительно не вызываю для него SystemTools.Free .

Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0145]     [ Gzipped ]