Пишу метод десериализации для считывания данных из файла и создания соответствующего объекта в памяти. Для того, чтобы пользователь не скучал, загружаю данные в отдельном потоке, а в главном запускаю TAniIndicator. Данные считываются, объект создается, AniIndicator работает. Но при попытке завершения приложения получаю утечку памяти (см. рис.). Пользовательские объекты я удаляю перед закрытием приложения, но в памяти остаются системные объекты, в том числе из библиотеки PPL. Сокращенный код метода загрузки данных ниже. С чем может быть связана утечка? Для детектирования утечек использую команду ReportMemoryLeaksOnShutdown := True. Если дополнительный поток не использую, утечек нет.
procedure LoadProjectFromFile(AFileName: string);
var
fut: IFuture<TComponent>;
cmp: TComponent;
begin
AniIndic.Enabled := True;
AniIndic.Visible := True;
fut := TTask.Future<TComponent>(
function: TComponent
begin
Result := LoadFromFile(AFileName);
end
);
TTask.Run(
procedure
begin
fut.Start;
cmp := fut.Value;
{$REGION 'После загрузки в главном потоке'}
TThread.Synchronize(nil,
procedure
begin
AniIndic.Enabled := False;
AniIndic.Visible := False;
if Assigned(cmp) then
begin
if cmp is TCAMProject then
begin
fProject := cmp as TCAMProject;
// здесь всякие действия
if Assigned(OnFinishedLoadProject) then
begin
OnFinishedLoadProject(nil);
end;
end
end
end
)
{$ENDREGION}
end
);
end;
Вопрос
antigrav
Здравствуйте, коллеги.
Пишу метод десериализации для считывания данных из файла и создания соответствующего объекта в памяти. Для того, чтобы пользователь не скучал, загружаю данные в отдельном потоке, а в главном запускаю TAniIndicator. Данные считываются, объект создается, AniIndicator работает. Но при попытке завершения приложения получаю утечку памяти (см. рис.). Пользовательские объекты я удаляю перед закрытием приложения, но в памяти остаются системные объекты, в том числе из библиотеки PPL. Сокращенный код метода загрузки данных ниже. С чем может быть связана утечка? Для детектирования утечек использую команду ReportMemoryLeaksOnShutdown := True. Если дополнительный поток не использую, утечек нет.
procedure LoadProjectFromFile(AFileName: string);
var
fut: IFuture<TComponent>;
cmp: TComponent;
begin
AniIndic.Enabled := True;
AniIndic.Visible := True;
fut := TTask.Future<TComponent>(
function: TComponent
begin
Result := LoadFromFile(AFileName);
end
);
TTask.Run(
procedure
begin
fut.Start;
cmp := fut.Value;
{$REGION 'После загрузки в главном потоке'}
TThread.Synchronize(nil,
procedure
begin
AniIndic.Enabled := False;
AniIndic.Visible := False;
if Assigned(cmp) then
begin
if cmp is TCAMProject then
begin
fProject := cmp as TCAMProject;
// здесь всякие действия
if Assigned(OnFinishedLoadProject) then
begin
OnFinishedLoadProject(nil);
end;
end
end
end
)
{$ENDREGION}
end
);
end;
Ссылка на комментарий
5 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.