Search
Write a publication
Pull to refresh

Исследовал тут проблему завершения программы при завершении сессии винды в FMX.
При таком сценарии происходит утечка памяти, т.к. Application не освобождается при завершении программы.
Проблема это не большая и ни на что не влияет. Но, помимо этого тут затронут момент сохранения пользовательских данных при завершении программы.
Как вы могли заметить, если программа убивается, например, Андроидом, когда он решил, что она давно не используется, то событий закрытия или уничтожения формы не происходит.

Я нашёл интересное событие у формы, но в первую очередь, я увидел, что в FMX, в отличии от VCL, по умолчанию обрабатывается событие WM_ENDSESSION и WM_QUERYENDSESSION, которые мы обычно в VCL обрабатывали вручную у формы через message. Так вот, WM_QUERYENDSESSION по-умолчанию разрешает завершение программы, а вот WM_ENDSESSION, который происходит после этого события генерирует событие у формы под названием OnSaveState.

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

Модуль FMX.Platform.Win.pas
Модуль FMX.Platform.Win.pas

О самой проблеме с утечкой. Её я тоже решил. Косяк в том, что при WM_ENDSESSION происходит завершение программы изнутри процедуры обработки сообщений, что в свою очередь приводит к задержанию в памяти Application.
Всему виной строка Halt (3-я снизу).

Решается это просто, если взять на себя модуль FMX.Platform.Win.pas и изменить немного этот код. Нужно Halt вызвать через очередь сообщений.

Application.Terminate;
TThread.ForceQueue(nil,
procedure
begin
Halt;
end);

Total votes 9: ↑9 and ↓0+9
Comments1

Articles