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

Помогите разобраться с TThread.ForceQueue


SVTX

Вопрос

Добрый день уважаемые эксперты.

Помогите разобраться с функцией TThread.ForceQueue

Пришлось внедрить ее как костыль в IOS для показа модальных форм, и получаем кучу ошибок на очистке памяти.

Подскажите кто и как правильно ее использует в работе.

Ниже рабочий код который гарантированно приведет к ошибке и у нас таких более 100 мест в проекте.

FFrom := TFrom.Create(nil);
  TThread.ForceQueue(nil, procedure
  begin
    FFrom.ShowModal(procedure(Res: TModalResult)
    begin
      FreeForm(FFrom); //--> и тут получаем кучу ошибок - как правило на Form.Hide почемуто
    end);
  end);
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Наоборот: сначала ShowModal, в колбеке ForceQueue Free

FFrom := TFrom.Create(nil);
FFrom.ShowModal(procedure(Res: TModalResult)
   begin
      TThread.ForceQueue(nil, procedure
      begin 
        FreeForm(FFrom);
      end);
   end);

 

Изменено пользователем Slym
Ссылка на комментарий
  • 0

Slym спасибо что откликнулись

На IOS а конкретно iPhone 12/13 изменилась архитектура и появился баг с ShowModal.

Описано в тикете https://quality.embarcadero.com/browse/RSP-36095

И там описан обходной путь именно как я написал.

Он работает, но если очищать форму все ломается. А если не чистить приложение падает через 20 новых созданных форм.

 

Ссылка на комментарий
  • 0

Я пробовал даже такой изврат, оно иногда работает, иногда нет, я так понимаю я упускаю чтото концептуальное и делаю неправильно.

FFrom := TFrom.Create(nil);
  TThread.ForceQueue(nil, procedure
  begin
    FFrom.ShowModal(procedure(Res: TModalResult)
    begin
      //FreeForm(FFrom); //--> и тут получаем кучу ошибок - как правило на Form.Hide почемуто
      TThread.ForceQueue(nil, procedure
      begin
        FForm.Free;
      end, 100);
    end);
  end);
Изменено пользователем SVTX
Ссылка на комментарий
  • 0
Только что, Slym сказал:

переменная FForm -не глобальная?

тогда FForm .ReleaseForm, но оно тоже через TThread.ForceQueue работает

Чаще всего глобальная.

Спасибо, сейчас буду пробовать!!

Ссылка на комментарий
  • 0
1 минуту назад, Slym сказал:

не надо глобальные переменные... делай локальные 

var FFrom := TFrom.Create(nil);

Я и так и так пробовал. Один корень. 

Поэтому пока решил что найду правильное решение и потом буду переводить на правильный код.

FFrom.Release также генерит ошибку.

Такое ощущение что чтото "держит" форму даже после завершения ForceQueue.

Ссылка на комментарий
  • 0
17 минут назад, Slym сказал:

не Release а ReleaseForm

не нашел этого метода у TForm FMX ((

Вижу, она ушла в protected.

Попробую выдернуть.

Изменено пользователем SVTX
Ссылка на комментарий
  • 0

type
TOpenForm=class(TForm) end;

TOpenForm(FForm).ReleaseForm;

Ты так никогда не делал?
До protectedов регулярно так делаю, TOpenForm становится френдли объектом и разрешает protected

 

Изменено пользователем Slym
Ссылка на комментарий
  • 0
7 минут назад, Slym сказал:

type
TOpenForm=class(TForm) end;

TOpenForm(FForm).ReleaseForm;

Ты так никогда не делал?
До protectedов регулярно так делаю

 

Забывается если не используешь регулярно.

Спасибо, уже получилось. Пробую.

Ссылка на комментарий
  • 0

думаю, что более правильно один из двух вариантов

1) вообще не создавать переменную. в onClose просто делать Free

2) созданной форме вешать на OnClose обработчик и там делать проверку ModalResult , так же как реализовано в TDialogService.MessageDialog

 

Изменено пользователем krapotkin
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...