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

ShowModal - почему нельзя использовать блокирующий режим?


kami

Вопрос

Добрый день всем!

Писал приложение под iOS, не задумываясь над различиями в ShowModal для разных платформ. В результате - когда назрела мысль портировать приложение под Android столкнулся с тем, что переделать код, использующий ShowModal на callback-вызовы очень сложно. Подумал, что может быть можно использовать эмуляцию, например:
 

function myMessageDialog(...): Integer;
var
  mr: TModalResult;
begin
  mr:=mrNone;
  TDialogService.MessageDialog(...
    procedure (const AResult: TModalResult)
    begin
      mr:=AResult
    end);

  while mr = mrNone do // ждем пока не сработает callback
    Application.ProcessMessages;
  Result:=mr; // и возвращаем результат
end;

Но... работать не хочет.

Почему? Ведь несмотря на то, что нативный диалог вызывается в контексте UI thread, коллбак и ProcessMessages работают в основном потоке приложения.

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

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

  • 1
  • Администраторы

Добрый день,

На андроиде в принципе не поддерживаются синхронные диалоги. И причина прежде всего в архитектуре андроид приложения.

Если говорить о нативном приложении, то оно состоит из двух потоков Java UI Thread  (Он же главный поток приложения) и Delphi Thread. FireMonkey работает в делфи треде. В то время, как все нативные вещи (диалоги, пикеры, браузеры, карты, медиа проигрыватели и тд) все они работают в Java UI Thread. Помимо этого, когда активити (работает в так же в java UI thread) меняет своё состояние (запущена, приостановлена, остановлена, возобновлена и тд), она должна синхронизировать это состояние в делфи треде. Или другими словами передать эту информацию в делфи тред. Для передачи используются пайпы с событиями. Поэтому пока делфи тред не прочитает новое состояние активити, Java UI thread будет находится в режиме ожидания. Чтение в делфи потока нового состояния происходит в цикле ProcessMessage.

Теперь возвращаясь к диалогам. Диалоги нативные, поэтому они должны быть синхронизированы (с ожиданием) с java UI thread. С другой стороны, в момент отображения диалога происходит событие из java ui thread Window Gained Focus, возникающее, когда в приложении меняется фокус между окнами (диалоговое окно в данном случае перехватывает фокус). Но как мы выяснили, это приводит к обратной синхронизации с делфи тредом.

Отсюда возникает классический deadlock. 

P.S. Это верно до версии Берлин включительно.

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

Это ограничение платформы Android/iOs

обратите внимание, что в исходном вопросе сказано, что блокирующий режим успешно используется мной на iOS.

32 минуты назад, Brovin Yaroslav сказал:

Отсюда возникает классический deadlock. 

Ярослав, спасибо!

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

 

Только что, kami сказал:

что блокирующий режим успешно используется мной на iOS.

На iOS другая архитектура, нет такого разделения на два потока. И самое главное есть метод для обработки сообщений из очереди.

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

 

На iOS другая архитектура, нет такого разделения на два потока. И самое главное есть метод для обработки сообщений из очереди.

Почему, интересно, не сделали так же один поток и с Android? Ну и что, что компиляция и сборка осуществляется без Paserver, на одной машине. Приложения были бы как родные )

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

Почему, интересно, не сделали так же один поток и с Android? Ну и что, что компиляция и сборка осуществляется без Paserver, на одной машине. Приложения были бы как родные )

Ярослав упомянул

2 часа назад, Brovin Yaroslav сказал:

P.S. Это верно до версии Берлин включительно.

В следующей версии студии будет один поток

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

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...