mrseagull Опубликовано 15 января, 2016 Поделиться Опубликовано 15 января, 2016 Писалась программа, написанного много кода, сейчас программа подвисает при выполнении некоторых процедур. Когда загружаем файл из интернета или когда парами XML файл. Можно каким-то образом легко выносит эти процедуры в поток. Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 16 января, 2016 Модераторы Поделиться Опубликовано 16 января, 2016 использовать такую конструкцию //uses System.Threading; TTask.Run( procedure begin // выполняем загрузку файла из интернета; TThread.Synchronize(nil, procedure begin // выполняем действия связанные с визуальными компонентами end); end); но помнить что из доп. потока нельзя запустить доп. поток mrseagull, Владимир, zairkz и 3 других 6 Цитата Ссылка на комментарий
0 Rusland Опубликовано 9 февраля, 2016 Поделиться Опубликовано 9 февраля, 2016 Zuby, можно ли использовать такую конструкцию в сервисе? Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 9 февраля, 2016 Модераторы Поделиться Опубликовано 9 февраля, 2016 ZuBy, можно ли использовать такую конструкцию в сервисе? думаю да, вот вы нам и скажите) а вообще если он использует основной поток для общения с системой, то и доп. потоки должны быть разрешены Цитата Ссылка на комментарий
0 krapotkin Опубликовано 9 февраля, 2016 Поделиться Опубликовано 9 февраля, 2016 OFF: вот ведь с одной стороны интересны анонимные ф-ии, но код с ними все больше похож на JavaScript - когда смешались кони, люди... Цитата Ссылка на комментарий
0 haword Опубликовано 9 февраля, 2016 Поделиться Опубликовано 9 февраля, 2016 procedure potoc1 begin // выполняем действия связанные с визуальными компонентами end procedure potoc begin // выполняем загрузку файла из интернета; TThread.Synchronize(nil, potoc1);end; TTask.Run(potoc); так лучше? Владимир 1 Цитата Ссылка на комментарий
0 Rusland Опубликовано 9 февраля, 2016 Поделиться Опубликовано 9 февраля, 2016 вот вы нам и скажите) Ставлю breakpoint, дебагер туда не заходит почему-то ) Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 9 февраля, 2016 Модераторы Поделиться Опубликовано 9 февраля, 2016 вот вы нам и скажите) Ставлю breakpoint, дебагер туда не заходит почему-то ) и не зайдёт, для отладки нужно убирать поток. такая ересь Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 9 февраля, 2016 Модераторы Поделиться Опубликовано 9 февраля, 2016 (изменено) OFF: вот ведь с одной стороны интересны анонимные ф-ии, но код с ними все больше похож на JavaScript - когда смешались кони, люди... с использованием анонимных функции жить стало легче, как по мне. я их использую не только в потоках, а как отложенное действие.. Приведу пример: Есть форма в которой выбираются некие данные, допустим местоположение. Эта форма вызывается из нескольких мест, т.е. результат выбора пользователя отправляется всегда в разные формы и в визуальные компоненты. Как я делал это раньше: Заводил некую глобальную переменную и по ней смотрел кто вызвал и куда отправить myVar := 'form1'; // для примера if myVar = 'form1' then form1.lbLocation.Text := myLocation // (допустим тут хранится выбранные данные пользователя ) else и т.д. Как теперь: Переопределяю метод формы Show с параметром aProc: TThreadProcedure procedure Show(aProc: TThreadProcedure); overload; создаю переменку FProcedure:TThreadProcedure в privat секции В методе Show присваиваю FProcedure:= aProc; Show; // обычный метод формы При выборе пользователем местоположения, выполняется вот такой код FProcedure;// наша отложенная процедура Close; // закрываем форму и задаю при показе формы процедуру которая должна выполнится при выборе местоположения 1 вариант myLocationForm.Show(procedure begin Form1.lbLocation.Text := myLocation end); 2 вариант myLocationForm.Show(procedure begin ShowMesage(myLocation); end); Некая свобода действий всегда хорошо, и довольно просто в реализации Изменено 9 февраля, 2016 пользователем ZuBy Kitty и zairkz 2 Цитата Ссылка на комментарий
0 krapotkin Опубликовано 10 февраля, 2016 Поделиться Опубликовано 10 февраля, 2016 Я тоже сделал свой подкласс для TForm, только aProc не в Show а прямо в Create получается аналог ShowModal(proc...() begin end) с небольшими нюансами Но в целом идея аналогична zairkz 1 Цитата Ссылка на комментарий
0 Rusland Опубликовано 11 мая, 2016 Поделиться Опубликовано 11 мая, 2016 (изменено) В 16.01.2016 в 08:32, ZuBy сказал: использовать такую конструкцию //uses System.Threading; TTask.Run( procedure begin // выполняем загрузку файла из интернета; TThread.Synchronize(nil, procedure begin // выполняем действия связанные с визуальными компонентами end); end); Воспользовался этой конструкцией для скачивания большого JSON (больше 1мб) TextLocation.Text:='1'; TTask.Run( procedure begin aResponser:=GetObj(Grp); // тут скачивается через NetHTTPClient TextLocation.Text:='2'; TThread.Synchronize(nil, procedure begin TextLocation.Text:='DDDM 3'; // зависание end); end); Так вот если я в Synchronize обращаюсь к визуальным компонентам, то получаю полное зависание планшета (Android 5) с последующей перезагрузкой устройства (причем на телефоне Android 4 такого не происходит). Отчего это? Изменено 11 мая, 2016 пользователем Rusland Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 11 мая, 2016 Модераторы Поделиться Опубликовано 11 мая, 2016 что вы делаете в синхронизации? код, а не иллюзию Цитата Ссылка на комментарий
0 Rusland Опубликовано 11 мая, 2016 Поделиться Опубликовано 11 мая, 2016 (изменено) В синхронизации я делал много чего, например, добавлял информацию в TList , но из-за зависаний я все закомментировал и оставил ровно то что написал: TextLocation.Text:='DDDM 3'; TextLocation - это TText Изменено 11 мая, 2016 пользователем Rusland Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 11 мая, 2016 Модераторы Поделиться Опубликовано 11 мая, 2016 дайте ссылку того что вы получаете, если что можно в личку Rusland 1 Цитата Ссылка на комментарий
0 haword Опубликовано 11 мая, 2016 Поделиться Опубликовано 11 мая, 2016 (изменено) если я не ошибаюсь надо оборачивать обращения в интерфейсу CallInUIThread( procedure begin TextLocation.Text:='DDDM 3'; end); Изменено 11 мая, 2016 пользователем haword Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 11 мая, 2016 Модераторы Поделиться Опубликовано 11 мая, 2016 5 минут назад, haword сказал: если я не ошибаюсь надо оборачивать обращения в интерфейсу CallInUIThread( procedure begin TextLocation.Text:='DDDM 3'; end); это не обязательно, такое нужно только если работаешь с нативными компонентами. Andrey Efimov, zairkz и Brovin Yaroslav 3 Цитата Ссылка на комментарий
0 #WAMACO Опубликовано 11 мая, 2016 Поделиться Опубликовано 11 мая, 2016 так как решилось то все? Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 12 мая, 2016 Модераторы Поделиться Опубликовано 12 мая, 2016 9 часов назад, wamaco сказал: так как решилось то все? дело было не в этой "конструкции", а в размере получаемых данных #WAMACO 1 Цитата Ссылка на комментарий
0 haword Опубликовано 12 мая, 2016 Поделиться Опубликовано 12 мая, 2016 некоторые компоненты имеют привычку становится нативными, если параметр один поменять. Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 12 мая, 2016 Модераторы Поделиться Опубликовано 12 мая, 2016 Так нужно помнить что в fmx нет нативных компонентов для андроида. Ну кроме Карт и браузера и еще парочки. Такие компоненты имитируют поведение для платформы zairkz 1 Цитата Ссылка на комментарий
0 enatechno Опубликовано 20 мая, 2016 Поделиться Опубликовано 20 мая, 2016 (изменено) В 11.05.2016 в 15:33, Rusland сказал: Так вот если я в Synchronize обращаюсь к визуальным компонентам В 11.05.2016 в 15:33, Rusland сказал: TextLocation.Text:='2'; Здесь Вы обращаетесь к визуальному компоненту в потоке, а не из Synchronize. Возможно в этом проблема? Изменено 20 мая, 2016 пользователем enatechno Rusland 1 Цитата Ссылка на комментарий
0 Rusland Опубликовано 20 мая, 2016 Поделиться Опубликовано 20 мая, 2016 (изменено) В общем решил я свою проблему на планшете - обновил его прошивку и проблема ушла, теперь сую ему несколько больших JSON, "кушает" и не ругается. PS. Ах да, я ж переписал программу, сам создаю поток и в нем все скачиваю Изменено 20 мая, 2016 пользователем Rusland Цитата Ссылка на комментарий
Вопрос
mrseagull
Писалась программа, написанного много кода, сейчас программа подвисает при выполнении некоторых процедур. Когда загружаем файл из интернета или когда парами XML файл. Можно каким-то образом легко выносит эти процедуры в поток.
Ссылка на комментарий
21 ответ на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.