|
|
|
FMX: ожидание чего-либо без блокировки UI
|
|||
|---|---|---|---|
|
#18+
Очередной сюрприз от FMX. Есть некий поток, который долго что-то передает по сети. Нужно дождаться его завершения, не блокируя UI. Вроде все просто: ожидаю завершения с малыми таймаутами в цикле, выполняя между итерациями Application.ProcessMessages. Собранный под Win бинарник работает как ожидается, а в ведроиде, что есть этот ProcessMessages, что нет его, результат всегда одинаковый: UI фризится, система постоянно норовит закрыть программу. Я понимаю, что по-хорошему нужно прямо из потока по завершению передачи делать Syncronize, где уже и обрабатывать результаты работы, но это тянет на полную переделку приложения, так что не вариант. По факту нужно просто тяжелый метод сделать не асинхронным, а просто не блокирующим обработку системных запросов, отвечающих за отлов "зависших" программ. Что нужно делать, чтобы система не думала, что приложение зациклилось намертво? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 18:16:37 |
|
||
|
FMX: ожидание чего-либо без блокировки UI
|
|||
|---|---|---|---|
|
#18+
Как система с тобой - так и ты с ней. Не тушуйся, имитируй активность: пусть тупая система думает, что она умная. На FMX такой трюк даже не костыль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 18:31:54 |
|
||
|
FMX: ожидание чего-либо без блокировки UI
|
|||
|---|---|---|---|
|
#18+
Roth Y, а как именно имитировать? Что конкретно делать в цикле? UPD: В 10.2 вообще цирк, если на пустое приложение бросить кнопку, в кнопке написать такое: Код: pascal 1. 2. 3. 4. То после ее нажатия все как и ожидается в свете моего вопроса, интерфейс фризится, но дело не в этом. Если после нажатия на кнопку ткнуть пальцем хоть раз по форме или любому другом контролу, то через ~30 секунд приложение вылетает с Segmetnation Fail (11). В 10.0 такого нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 18:41:42 |
|
||
|
FMX: ожидание чего-либо без блокировки UI
|
|||
|---|---|---|---|
|
#18+
misha mike, Более дурное решение педставить трудно. Слабо было по таймеру завершение процесса проверять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 18:50:44 |
|
||
|
FMX: ожидание чего-либо без блокировки UI
|
|||
|---|---|---|---|
|
#18+
rgreat , я же написал, нужно максимально просто избавиться от "Application isn't responding" в уже существующем приложении. Любым способом. Ожидание в таймере ничем не лучше (да и вообще хрень полная), чем вызов ожидающего кода прямо из потока через Syncronize. Но это требует полной переработки программы , где "долгий" метод находится в середине длинного стека вызовов, да еще и на нескольких уровнях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 18:58:56 |
|
||
|
FMX: ожидание чего-либо без блокировки UI
|
|||
|---|---|---|---|
|
#18+
misha mike, Как хотите. Право говнокодить есть у каждого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 19:01:36 |
|
||
|
FMX: ожидание чего-либо без блокировки UI
|
|||
|---|---|---|---|
|
#18+
Я так понимаю, что у Вас где-то такая процедура Код: pascal 1. 2. 3. 4. 5. 6. и Вам нужно, чтобы все это выполнялось последовательно. Как вариант, вот Вам такой костыль Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. И где-то на завершение потока Код: pascal 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2017, 19:23:27 |
|
||
|
FMX: ожидание чего-либо без блокировки UI
|
|||
|---|---|---|---|
|
#18+
Не знаю тонкостей обработки сообщений в Андроид, но в FMX сделали что-то типа такого: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. А ты ожидаешь: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. По крайне мере так было в XE5, когда я полез разбираться почему такая фигня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 13:38:28 |
|
||
|
FMX: ожидание чего-либо без блокировки UI
|
|||
|---|---|---|---|
|
#18+
1. запускаем AniIndicator 2. запускаем поток 3. все функционирует нормально. поток сам по себе 4. в Onterminate поток выключает AniIndicator и делает все что нужно если нужно таймаут, можно запустить TTask.Run где внутри Sleep(timeout); StopWaitingAndShowYourMessage(); или олдскульно через ттаймер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2017, 16:37:02 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39476745&tid=2042094]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
196ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 226ms |
| total: | 523ms |

| 0 / 0 |
