SaveScreen/RestoreScreen

Место, где разработчики плагинов могут поделиться своим опытом.
Shmuel
Posts: 6017
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 26 times
Been thanked: 278 times

SaveScreen/RestoreScreen

Post by Shmuel »

В энциклопедии написано, что для предотвращения утечки памяти нужно всегда вызывать RestoreScreen. Но иногда по логике работы плагина восстанавливать экран не надо - например на экране прогресс-бар копирования файла данным плагином, юзер нажимает Esc, выводится диалог подтверждения прерывания, юзер подтверждает. После чего нет смысла восстанавливать экран с частично заполненным прогресс-баром для отменённого файла.

Как насчёт добавления функции FreeScreen, которая будет освобождать память, но не восстанавливать экран?

User avatar
DrKnS
Posts: 5511
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 6 times
Been thanked: 279 times

SaveScreen/RestoreScreen

Post by DrKnS »


Shmuel
Posts: 6017
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 26 times
Been thanked: 278 times

SaveScreen/RestoreScreen

Post by Shmuel »

DrKnS wrote:
Thu 06 Feb, 2020 10:40
viewtopic.php?p=153175#p153175
Что значит осложнить разработку Фар в будущем? Если SaveScreen/RestoreScreen не будут поддерживаться, то ничего не осложнится, часть существующих плагинов поломается, вот и всё. А если будут поддерживаться, то чем помешает функция FreeScreen?

Альтернативой использование SaveScreen сейчас является сделать примерно то же самое самому плагину, а зачем, если имеется готовая функция?

User avatar
DrKnS
Posts: 5511
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 6 times
Been thanked: 279 times

SaveScreen/RestoreScreen

Post by DrKnS »

Shmuel wrote:
Thu 06 Feb, 2020 10:52
Что значит осложнить разработку Фар в будущем?
Значит примерно то, что сохранять и восстанавливать экран было уместно в 1998, когда у всех было 80x25, а фар еще не был подобен самолету из анекдота. В современном мире пользователь крутит консолью, шо цыган солнцем, плагины переключают окна и рисуют шопопало в произвольные моменты времени и вы, в общем случае, не можете расчитывать на то, что ваш скриншот будет иметь хоть какой-то смысл, а не уподобится работе Пикассо.
Этот паттерн (как и Text()) - жуткое легаси, которое в обозримом будущем будет поддерживаться в целях совместимости, но расширять его, и этим поощрять его дальнейшее использование, как-то не особо хочется.
Альтернативой использование SaveScreen сейчас является сделать примерно то же самое самому плагину
Альтернативой является использование концепций, о которых фар знает и может их самостоятельно и правильно нарисовать, (например, dialog & user control), либо предложение новых, если существующих недостаточно.

Я не отрицаю, что в конкретно вашем плагине savescreen может быть вполне уместен и безопасен, но даже в этом случае может быть лучше навелосипедить своё, т.к. save/restorescreen по какой-то неземной логике работают со внутренним буфером, а не с актуальной консолью, иными словами далеко не факт, что оно сохранит то, что вы видите, или восстановит то, что вы ожидаете.

buniak_a_h
Posts: 1430
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 100 times
Been thanked: 113 times
Contact:

SaveScreen/RestoreScreen

Post by buniak_a_h »

Можно мои 5 копеек (основанных на опыте использования SaveScreen/RestoreScreen в других языках)?
Делается, например, так:
Table = SaveScreen(x1,y1,x2,y2) -- разница в том, что возвращается не некий хендл на память, а таблицу символов и цветовых характеристик
Т.е. никакая память ВНУТРИ процедуры не сохраняется; всё передаётся "наружу". Что с этим делать - решает внешняя процедура. Может восстановить. Может перед восстановлением изменить (например, так удобно выделять нечто цветом. Тогда действительно Text() станет историей). Может использовать как результат чтения с консоли (было бы удобно без подключения АПИ консоли). Может просто забыть (сборщик мусора потом уберёт).
Кстати, про Text(): увы, приходится использовать именно для раскраски части экрана (не в редакторе; в редакторе для этого есть editor.AddColor. А в диалоге как без Text()?).

Shmuel
Posts: 6017
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 26 times
Been thanked: 278 times

SaveScreen/RestoreScreen

Post by Shmuel »

DrKnS wrote:
Thu 06 Feb, 2020 12:26
[...]
Я не отрицаю, что в конкретно вашем плагине savescreen может быть вполне уместен и безопасен, но даже в этом случае может быть лучше навелосипедить своё
Конкретно мой случай описан в первом сообщении. Случай простой и довольно типичный. Проявился потому, что после отмены до следующего вывода на экран проходит не менее секунды и этот прогресс-бар уже отменённого файла торчит эту секунду на экране, что, согласитесь, для пользователя выглядит нелепо.

Отвлекаться на свои новые велосипеды, когда продвигаешь конкретную функциональность, совсем не хочется.
Поэтому сделал так:
- после отмены копирования пользователем делаю SaveScreen ещё раз
- восстанавливаю первый хэндл экрана
- если второй хэндл не nil, восстанавливаю и его
Визуально перерисовки не заметны.

Вообще-то FreeScreen должно быть сделать очень просто, и я собирался сделать его сам, предварительно удостоверившись, что никто не против. Но раз такие пироги, делать не будем.

User avatar
John Doe
Бюрократ
Posts: 12647
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 268 times

SaveScreen/RestoreScreen

Post by John Doe »

А объясните суть данного изменения https://github.com/FarGroup/FarManager/ ... 3ce5f950bf
Что происходит при сборке мусора?

Shmuel
Posts: 6017
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 26 times
Been thanked: 278 times

SaveScreen/RestoreScreen

Post by Shmuel »

John Doe wrote:
Thu 06 Feb, 2020 14:35
А объясните суть данного изменения https://github.com/FarGroup/FarManager/ ... 3ce5f950bf
Что происходит при сборке мусора?
Там в общем-то 2 изменения. Одно проверяет, что в RestoreScreen подаётся правильный тип данных, второе - поддержка случая RestoreScreen(NULL), описанного в энциклопедии.
При сборке мусора ничего не происходит. Я не стал добавлять метод __gc из-за побочного эффекта восстановления старого экрана в непредсказуемый момент времени.

User avatar
John Doe
Бюрократ
Posts: 12647
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 268 times

SaveScreen/RestoreScreen

Post by John Doe »

Shmuel wrote:
Thu 06 Feb, 2020 15:03
При сборке мусора ничего не происходит. Я не стал добавлять метод __gc из-за побочного эффекта восстановления старого экрана в непредсказуемый момент времени.
Значит тикет ещё актуален.

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

А подходящий момент может быть например перед очередным Restore, или перед ACTL_REDRAWALL, или более явно - отдельной командой far.FreeScreen() (которая не будет основана на апи).
В луамакро эта команда вызывалась бы при перезагрузке макросов.

User avatar
DrKnS
Posts: 5511
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 6 times
Been thanked: 279 times

SaveScreen/RestoreScreen

Post by DrKnS »

Shmuel wrote:
Thu 06 Feb, 2020 15:03
после отмены до следующего вывода на экран проходит не менее секунды и этот прогресс-бар уже отменённого файла торчит эту секунду на экране, что, согласитесь, для пользователя выглядит нелепо
Несомненно.
Однако, если вы показывали прогресс-бар, то с файлом, вероятно, что-то происходило, содержимое панели, возможно, уже не совсем соответствует действительности и лучше всё перерисовать сразу, чтобы не получилось ещё нелепее (опять же - в общем случае, у вас всё может быть иначе).

Shmuel
Posts: 6017
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 26 times
Been thanked: 278 times

SaveScreen/RestoreScreen

Post by Shmuel »

John Doe wrote:
Thu 06 Feb, 2020 15:32
Значит тикет ещё актуален.
Тикет давно закрыт и на мой взгляд, абсолютно неактуален. LuaFAR не ставит перед собой задачу штопать дыры Far API. Если бы была функция FreeScreen, вопрос был бы давно закрыт.
DrKnS wrote:
Thu 06 Feb, 2020 15:44
Однако, если вы показывали прогресс-бар, то с файлом, вероятно, что-то происходило, содержимое панели, возможно, уже не совсем соответствует действительности и лучше всё перерисовать сразу, чтобы не получилось ещё нелепее
Но ведь когда Фар копирует множество файлов и юзер отменяет посередине копирование текущего большого файла, Фар ведь не обновляет при этом панели с учётом уже скопированных файлов.

User avatar
John Doe
Бюрократ
Posts: 12647
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 268 times

SaveScreen/RestoreScreen

Post by John Doe »

Shmuel wrote:
Thu 06 Feb, 2020 16:01
LuaFAR не ставит перед собой задачу штопать дыры Far API.
Для Си-апи всё нормально, там миллион способов стрельнуть себе в ногу.
Но LuaFAR снимает с пользователя все заботы о выделении ресурсов, поэтому спрос совсем другой.
И ладно ещё в отдельно взятом луафар-плагине, но среда луамакро намного более располагает к проявлению утечек, поскольку в течении сеанса скрипты перезагружаться могут по многу раз.

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

Shmuel
Posts: 6017
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 26 times
Been thanked: 278 times

SaveScreen/RestoreScreen

Post by Shmuel »

John Doe wrote:
Thu 06 Feb, 2020 16:20
Так что проблема хоть и не велика, но вполне актуальна, и тикет закрыт преждевременно.
У меня с вами разное видение этого вопроса, и в этом ничего особенного нет.
Тикет закрыт потому, что исходная корневая проблема не в луафаре, а в фар апи. Вот и всё. Почему вы упорствуете, в том, что луафар должен закрывать дырку в фар апи. Почему пристаёте ко мне, а не, например к DrKnS, который прямо сегодня высказался против FreeScreen.

Тикет можете переоткрыть, если вам это принесёт облегчение. Но я с этим делать ничего не намерен.

User avatar
John Doe
Бюрократ
Posts: 12647
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 35 times
Been thanked: 268 times

SaveScreen/RestoreScreen

Post by John Doe »

Shmuel wrote:
Thu 06 Feb, 2020 16:30
Почему вы упорствуете, в том, что луафар должен закрывать дырку в фар апи.
Вовсе нет:
John Doe wrote:
Thu 06 Feb, 2020 16:20
Я не утверждаю даже, что это прям необходимо фиксить в луафаре.
И на мантисе миллион минорных тикетов, которые врядли когда-либо будут исправлены.
На мой взгляд это не означает что их надо закрыть.

Shmuel
Posts: 6017
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 26 times
Been thanked: 278 times

SaveScreen/RestoreScreen

Post by Shmuel »

John Doe wrote:
Thu 06 Feb, 2020 16:47
И на мантисе миллион минорных тикетов, которые врядли когда-либо будут исправлены.
На мой взгляд это не означает что их надо закрыть.
Тикеты, которые открыты в неправильном, несоответствующем проекте, в данном случае луафар вместо фар апи, надо закрывать. Если вас действительно беспокоит этот вопрос, откройте другой тикет, в правильном проекте.

Post Reply

Return to “Разработка плагинов”