Перейти к содержанию
Fire Monkey от А до Я

antigrav

Пользователи
  • Постов

    28
  • Зарегистрирован

  • Посещение

Посетители профиля

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

  1. Всем доброго здоровья! Есть необходимость менять исходный компилируемый код в зависимости от текущей конфигурации сборки (Build Configurations). Сейчас их две: debug и release. Например, для исключения поиска утечек памяти в конфигурации release (ReportMemoryLeaksOnShutdown := False). Как можно узнать текущую конфигурацию сборки в исходном коде?
  2. Применено так, как вы предложили. В методе FormClose. В тестовом примере оказывается ThreadPoolStats.IdleWorkerThreadCount=3 и ThreadPoolStats.WorkerThreadCount=3 Условие не выполняется, программа закрывается с утечкой. Насколько я понял, ThreadPoolStats.IdleWorkerThreadCount хранит кол-во потоков, ожидающих завершения. Если, например, изменить условие на if ThreadPoolStats.IdleWorkerThreadCount>0 то приложение просто невозможно закрыть.
  3. Уважаемый Slym, к сожалению предложенный способ результата не дал. Если я правильно понял, условие ThreadPoolStats.IdleWorkerThreadCount<>ThreadPoolStats.WorkerThreadCount является признаком того, что не все таски завершены. При тестировании приложения это условие не выполняется (то есть все такси завершены?), управление передается деструктору главной формы приложения, в котором дается команда на удаление пользовательских объектов. Пользовательские объекты удаляются. Затем выдается сообщение об утечке памяти и приложение закрывается.
  4. Спасибо, попробую
  5. 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;
  6. Спасибо, Slym! Задача решена!
  7. Здравствуйте! Пишу алгоритм с параллельными вычислениями. Один из объектов является разделяемым ресурсом и хотелось бы его клонировать. Объект достаточно сложный и использует другие объекты. Возникла идея применения механизма сериализации/десериализации. Примерный код ниже. function Cloning(RootObject: TComponent): TComponent; var MemStream: TMemoryStream; begin MemStream := TMemoryStream.Create; try MemStream.WriteComponent(RootObject); MemStream.Position := 0; Result := MemStream.ReadComponent(RootObject); finally MemStream.Free; end; end; Данный код, однако, не дает нужного результата. Исходный компонент RootObject и Result, в итоге, ссылаются на одну и ту же область памяти. Может ли уважаемое сообщество предложить какие-то решения?
  8. Снимаю предыдущий вопрос. Можно проверить через обращение к MainThreadID.
  9. Правильно ли я понимаю, что номер, который печатался в опубликованном фрагменте кода - это номер главного потока?
  10. Да, после выноса TThread.CurrentThread.ThreadID.ToString выше Synchronize(), получил разные номера потоков. Спасибо!
  11. Здравствуйте! Имею следующий фрагмент кода: fines: array of Extended; TParallel.For(0, Pred(count), procedure(index: Integer) begin fines[index] := CalculateFine(Index); TThread.Synchronize(nil, procedure begin Memo.Lines.Add('ThreadID = ' + TThread.CurrentThread.ThreadID.ToString); end); end); В логе получаю один и тот же номер ThreadID для всех значений index. Разве не должны быть созданы count потоков, каждый со своим ID?
  12. Это интересно. Спасибо!
  13. Вы имеете ввиду в режиме синхронизации пересылать в лог главного потока данные из дополнительного с указанием номера дополнительного потока?
  14. Кто-нибудь юзал такую штуку: "параллельный отладчик Parnassus"? Если да, то какое мнение? И можно ли его получить и установить не имея активной подписки на обновления?
×
×
  • Создать...