Выполнять действия перед сборкой мусора

Я хотел бы выполнить некоторые действия с конкретной сущностью после того, как на нее больше не будет ссылок, но перед тем, как сборщик мусора сотрет свои данные. Я использую это для эксперимента с более "чисто функциональными" графическими абстракциями. вот что я хотел бы сделать:

(let [window (make-window width height)] ; A
  (various-actions window)
  (let [window (resize window new-width new-height)] ; B
    (more-actions window))
  (and-more-actions window)) ; C

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

в C после того, как мы закончим делать что-либо в B и оставим эту область let, объект окна B будет не ссылаться и собирать мусор. но я хочу сигнализировать основному оконному механизму, что он должен откатить изменения B сейчас и снова принять действие области действия. таким образом, действие на C будет таким, как если бы B-эффекты не происходили.

кроме того, если на окно верхнего уровня A больше нет ссылок, оно должно быть уничтожено любым способом перед сборкой мусора.

Я мог бы справиться с этим, заставив make-window изменить глобальное состояние, которое регистрирует ссылки на окна, но я не уверен, как определить точку, в которой ссылка на область B теряется. Как я могу проверить ссылки на часть данных? или есть другой способ решения этой проблемы?

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

1 ответ

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

Из описания вашей проблемы не совсем понятно, что вы на самом деле хотите сделать, но привязка к сборщику мусора наверняка будет неправильным способом сделать это. Возможно, вы могли бы добавить код после ухода B это будет делать все, что вы хотите.

Другие вопросы по тегам