powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FMX: ожидание чего-либо без блокировки UI
9 сообщений из 9, страница 1 из 1
FMX: ожидание чего-либо без блокировки UI
    #39476390
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очередной сюрприз от FMX.

Есть некий поток, который долго что-то передает по сети. Нужно дождаться его завершения, не блокируя UI.

Вроде все просто: ожидаю завершения с малыми таймаутами в цикле, выполняя между итерациями Application.ProcessMessages. Собранный под Win бинарник работает как ожидается, а в ведроиде, что есть этот ProcessMessages, что нет его, результат всегда одинаковый: UI фризится, система постоянно норовит закрыть программу.

Я понимаю, что по-хорошему нужно прямо из потока по завершению передачи делать Syncronize, где уже и обрабатывать результаты работы, но это тянет на полную переделку приложения, так что не вариант.

По факту нужно просто тяжелый метод сделать не асинхронным, а просто не блокирующим обработку системных запросов, отвечающих за отлов "зависших" программ. Что нужно делать, чтобы система не думала, что приложение зациклилось намертво?
...
Рейтинг: 0 / 0
FMX: ожидание чего-либо без блокировки UI
    #39476396
Roth Y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как система с тобой - так и ты с ней. Не тушуйся, имитируй активность: пусть тупая система думает, что она умная. На FMX такой трюк даже не костыль.
...
Рейтинг: 0 / 0
FMX: ожидание чего-либо без блокировки UI
    #39476401
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roth Y, а как именно имитировать? Что конкретно делать в цикле?

UPD: В 10.2 вообще цирк, если на пустое приложение бросить кнопку, в кнопке написать такое:
Код: pascal
1.
2.
3.
4.
repeat
  Sleep(100);
  Application.ProcessMessages;
until False;


То после ее нажатия все как и ожидается в свете моего вопроса, интерфейс фризится, но дело не в этом. Если после нажатия на кнопку ткнуть пальцем хоть раз по форме или любому другом контролу, то через ~30 секунд приложение вылетает с Segmetnation Fail (11). В 10.0 такого нет.
...
Рейтинг: 0 / 0
FMX: ожидание чего-либо без блокировки UI
    #39476406
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike,

Более дурное решение педставить трудно.

Слабо было по таймеру завершение процесса проверять?
...
Рейтинг: 0 / 0
FMX: ожидание чего-либо без блокировки UI
    #39476410
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat , я же написал, нужно максимально просто избавиться от "Application isn't responding" в уже существующем приложении. Любым способом.

Ожидание в таймере ничем не лучше (да и вообще хрень полная), чем вызов ожидающего кода прямо из потока через Syncronize. Но это требует полной переработки программы , где "долгий" метод находится в середине длинного стека вызовов, да еще и на нескольких уровнях.
...
Рейтинг: 0 / 0
FMX: ожидание чего-либо без блокировки UI
    #39476413
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike,

Как хотите. Право говнокодить есть у каждого.
...
Рейтинг: 0 / 0
FMX: ожидание чего-либо без блокировки UI
    #39476419
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, что у Вас где-то такая процедура
Код: pascal
1.
2.
3.
4.
5.
6.
procedure DoProcess;
begin
  RunProcess;
  WaitProcess;
  ProcessProcess;
end;

и Вам нужно, чтобы все это выполнялось последовательно. Как вариант, вот Вам такой костыль
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure DoProcess;
begin
  case FStatus of
    stInit: begin
      SaveLocalVars;
      FStatus := stRun;
      RunProcess;
    end;
    stRun:;  // Nothing
    stProcess: begin
      LoadLocalVars;
      ProcessProcess;
      FStatus := stInit;
    end;
  end;
end;

И где-то на завершение потока
Код: pascal
1.
2.
3.
4.
5.
procedure DoEndThread;
begin
  FStatus := stProcess;
  DoProcess;
end;
...
Рейтинг: 0 / 0
FMX: ожидание чего-либо без блокировки UI
    #39476745
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю тонкостей обработки сообщений в Андроид, но в FMX сделали что-то типа такого:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure ProcessMessages;
var
  Event: TEvent;
begin
  if not EventQueue.Lock then
    Exit;
  EventQueue.GetEvent(Event);
  CallEventHandler;
  EventQueue.UnLock;
end;

А ты ожидаешь:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure ProcessMessages;
var
  Event: TEvent;
begin
  if not EventQueue.Lock then
    Exit;
  EventQueue.GetEvent(Event);
  EventQueue.UnLock;
  CallEventHandler;
end;



По крайне мере так было в XE5, когда я полез разбираться почему такая фигня.
...
Рейтинг: 0 / 0
FMX: ожидание чего-либо без блокировки UI
    #39478581
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. запускаем AniIndicator
2. запускаем поток
3. все функционирует нормально. поток сам по себе
4. в Onterminate поток выключает AniIndicator и делает все что нужно

если нужно таймаут, можно запустить TTask.Run где внутри
Sleep(timeout);
StopWaitingAndShowYourMessage();
или олдскульно через ттаймер
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FMX: ожидание чего-либо без блокировки UI
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]