SaveScreen/RestoreScreen
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
SaveScreen/RestoreScreen
В энциклопедии написано, что для предотвращения утечки памяти нужно всегда вызывать RestoreScreen. Но иногда по логике работы плагина восстанавливать экран не надо - например на экране прогресс-бар копирования файла данным плагином, юзер нажимает Esc, выводится диалог подтверждения прерывания, юзер подтверждает. После чего нет смысла восстанавливать экран с частично заполненным прогресс-баром для отменённого файла.
Как насчёт добавления функции FreeScreen, которая будет освобождать память, но не восстанавливать экран?
Как насчёт добавления функции FreeScreen, которая будет освобождать память, но не восстанавливать экран?
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
SaveScreen/RestoreScreen
Что значит осложнить разработку Фар в будущем? Если SaveScreen/RestoreScreen не будут поддерживаться, то ничего не осложнится, часть существующих плагинов поломается, вот и всё. А если будут поддерживаться, то чем помешает функция FreeScreen?
Альтернативой использование SaveScreen сейчас является сделать примерно то же самое самому плагину, а зачем, если имеется готовая функция?
- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
SaveScreen/RestoreScreen
Значит примерно то, что сохранять и восстанавливать экран было уместно в 1998, когда у всех было 80x25, а фар еще не был подобен самолету из анекдота. В современном мире пользователь крутит консолью, шо цыган солнцем, плагины переключают окна и рисуют шопопало в произвольные моменты времени и вы, в общем случае, не можете расчитывать на то, что ваш скриншот будет иметь хоть какой-то смысл, а не уподобится работе Пикассо.
Этот паттерн (как и Text()) - жуткое легаси, которое в обозримом будущем будет поддерживаться в целях совместимости, но расширять его, и этим поощрять его дальнейшее использование, как-то не особо хочется.
Альтернативой является использование концепций, о которых фар знает и может их самостоятельно и правильно нарисовать, (например, dialog & user control), либо предложение новых, если существующих недостаточно.Альтернативой использование SaveScreen сейчас является сделать примерно то же самое самому плагину
Я не отрицаю, что в конкретно вашем плагине savescreen может быть вполне уместен и безопасен, но даже в этом случае может быть лучше навелосипедить своё, т.к. save/restorescreen по какой-то неземной логике работают со внутренним буфером, а не с актуальной консолью, иными словами далеко не факт, что оно сохранит то, что вы видите, или восстановит то, что вы ожидаете.
- buniak_a_h
- Posts: 4269
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
SaveScreen/RestoreScreen
Можно мои 5 копеек (основанных на опыте использования SaveScreen/RestoreScreen в других языках)?
Делается, например, так:
Т.е. никакая память ВНУТРИ процедуры не сохраняется; всё передаётся "наружу". Что с этим делать - решает внешняя процедура. Может восстановить. Может перед восстановлением изменить (например, так удобно выделять нечто цветом. Тогда действительно
Кстати, про
Делается, например, так:
Table = SaveScreen(x1,y1,x2,y2) -- разница в том, что возвращается не некий хендл на память, а таблицу символов и цветовых характеристик
Т.е. никакая память ВНУТРИ процедуры не сохраняется; всё передаётся "наружу". Что с этим делать - решает внешняя процедура. Может восстановить. Может перед восстановлением изменить (например, так удобно выделять нечто цветом. Тогда действительно
Text()
станет историей). Может использовать как результат чтения с консоли (было бы удобно без подключения АПИ консоли). Может просто забыть (сборщик мусора потом уберёт).Кстати, про
Text()
: увы, приходится использовать именно для раскраски части экрана (не в редакторе; в редакторе для этого есть editor.AddColor
. А в диалоге как без Text()
?).-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
SaveScreen/RestoreScreen
Конкретно мой случай описан в первом сообщении. Случай простой и довольно типичный. Проявился потому, что после отмены до следующего вывода на экран проходит не менее секунды и этот прогресс-бар уже отменённого файла торчит эту секунду на экране, что, согласитесь, для пользователя выглядит нелепо.
Отвлекаться на свои новые велосипеды, когда продвигаешь конкретную функциональность, совсем не хочется.
Поэтому сделал так:
- после отмены копирования пользователем делаю SaveScreen ещё раз
- восстанавливаю первый хэндл экрана
- если второй хэндл не nil, восстанавливаю и его
Визуально перерисовки не заметны.
Вообще-то FreeScreen должно быть сделать очень просто, и я собирался сделать его сам, предварительно удостоверившись, что никто не против. Но раз такие пироги, делать не будем.
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
SaveScreen/RestoreScreen
А объясните суть данного изменения https://github.com/FarGroup/FarManager/ ... 3ce5f950bf
Что происходит при сборке мусора?
Что происходит при сборке мусора?
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
SaveScreen/RestoreScreen
Там в общем-то 2 изменения. Одно проверяет, что в RestoreScreen подаётся правильный тип данных, второе - поддержка случая RestoreScreen(NULL), описанного в энциклопедии.John Doe wrote: ↑Thu 06 Feb, 2020 14:35 А объясните суть данного изменения https://github.com/FarGroup/FarManager/ ... 3ce5f950bf
Что происходит при сборке мусора?
При сборке мусора ничего не происходит. Я не стал добавлять метод __gc из-за побочного эффекта восстановления старого экрана в непредсказуемый момент времени.
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
SaveScreen/RestoreScreen
Значит тикет ещё актуален.
И кое-что сделать всё-таки можно: вести учёт потерянных хэндлов, и освобождать их в подходящий момент безопасным образом (вариант которого вы описали выше).
А подходящий момент может быть например перед очередным Restore, или перед ACTL_REDRAWALL, или более явно - отдельной командой far.FreeScreen() (которая не будет основана на апи).
В луамакро эта команда вызывалась бы при перезагрузке макросов.
- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
SaveScreen/RestoreScreen
Несомненно.
Однако, если вы показывали прогресс-бар, то с файлом, вероятно, что-то происходило, содержимое панели, возможно, уже не совсем соответствует действительности и лучше всё перерисовать сразу, чтобы не получилось ещё нелепее (опять же - в общем случае, у вас всё может быть иначе).
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
SaveScreen/RestoreScreen
Тикет давно закрыт и на мой взгляд, абсолютно неактуален. LuaFAR не ставит перед собой задачу штопать дыры Far API. Если бы была функция FreeScreen, вопрос был бы давно закрыт.
Но ведь когда Фар копирует множество файлов и юзер отменяет посередине копирование текущего большого файла, Фар ведь не обновляет при этом панели с учётом уже скопированных файлов.
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
SaveScreen/RestoreScreen
Для Си-апи всё нормально, там миллион способов стрельнуть себе в ногу.
Но LuaFAR снимает с пользователя все заботы о выделении ресурсов, поэтому спрос совсем другой.
И ладно ещё в отдельно взятом луафар-плагине, но среда луамакро намного более располагает к проявлению утечек, поскольку в течении сеанса скрипты перезагружаться могут по многу раз.
Так что проблема хоть и не велика, но вполне актуальна, и тикет закрыт преждевременно.
Я не утверждаю даже, что это прям необходимо фиксить в луафаре.
Нет значит нет, пусть себе тикет висит, как напоминание о дыре.
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
SaveScreen/RestoreScreen
У меня с вами разное видение этого вопроса, и в этом ничего особенного нет.
Тикет закрыт потому, что исходная корневая проблема не в луафаре, а в фар апи. Вот и всё. Почему вы упорствуете, в том, что луафар должен закрывать дырку в фар апи. Почему пристаёте ко мне, а не, например к DrKnS, который прямо сегодня высказался против FreeScreen.
Тикет можете переоткрыть, если вам это принесёт облегчение. Но я с этим делать ничего не намерен.
- John Doe
- Бюрократ
- Posts: 13867
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
SaveScreen/RestoreScreen
Вовсе нет:
И на мантисе миллион минорных тикетов, которые врядли когда-либо будут исправлены.
На мой взгляд это не означает что их надо закрыть.
-
- Posts: 6840
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
SaveScreen/RestoreScreen
Тикеты, которые открыты в неправильном, несоответствующем проекте, в данном случае луафар вместо фар апи, надо закрывать. Если вас действительно беспокоит этот вопрос, откройте другой тикет, в правильном проекте.