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

Потоки и процедуры


mrseagull

Вопрос

Писалась программа, написанного много кода, сейчас программа подвисает при выполнении некоторых процедур. Когда загружаем файл из интернета или когда парами XML файл. Можно каким-то образом легко выносит эти процедуры в поток.

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

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

  • 0
  • Модераторы

использовать такую конструкцию

//uses System.Threading;

TTask.Run(
     procedure 
     begin
        // выполняем загрузку файла из интернета;

        TThread.Synchronize(nil, procedure
           begin
              // выполняем действия связанные с визуальными компонентами
           end);
end);

но помнить что из доп. потока нельзя запустить доп. поток

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

ZuBy, можно ли использовать такую конструкцию в сервисе?

думаю да, вот вы нам и скажите)

 

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

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

procedure potoc1

 begin

              // выполняем действия связанные с визуальными компонентами

 end

 

 procedure potoc

 begin

        // выполняем загрузку файла из интернета;

       TThread.Synchronize(nil, potoc1);

end;

 

TTask.Run(potoc);

 

так лучше?  :D

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

 

вот вы нам и скажите)

Ставлю breakpoint, дебагер туда не заходит почему-то )

 

и не зайдёт, для отладки нужно убирать поток. такая ересь

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

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);

Некая свобода действий всегда хорошо, и довольно просто в реализации

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

Я тоже сделал свой подкласс для TForm, только aProc не в Show а прямо в Create

получается аналог ShowModal(proc...() begin end) с небольшими нюансами

Но в целом идея аналогична

Ссылка на комментарий
  • 0
В 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 такого не происходит). Отчего это?

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

В синхронизации я делал много чего, например, добавлял информацию в TList , но из-за зависаний я все закомментировал и оставил ровно то что написал:

TextLocation.Text:='DDDM 3';

TextLocation - это TText

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

если я не ошибаюсь надо оборачивать обращения в интерфейсу 

CallInUIThread(

         procedure
            begin

                 TextLocation.Text:='DDDM 3';
            end);

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

если я не ошибаюсь надо оборачивать обращения в интерфейсу 

CallInUIThread(

         procedure
            begin

                 TextLocation.Text:='DDDM 3';
            end);

это не обязательно, такое нужно только если работаешь с нативными компонентами.

Ссылка на комментарий
  • 0
  • Модераторы
9 часов назад, wamaco сказал:

так как решилось то все?

дело было не в этой "конструкции", а в размере получаемых данных

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

Так нужно помнить что в fmx нет нативных компонентов для андроида. Ну кроме Карт и браузера и еще парочки.

Такие компоненты имитируют поведение для платформы

Ссылка на комментарий
  • 0
В 11.05.2016 в 15:33, Rusland сказал:

Так вот если я в Synchronize обращаюсь к визуальным компонентам

В 11.05.2016 в 15:33, Rusland сказал:

TextLocation.Text:='2';

Здесь Вы обращаетесь к визуальному компоненту в потоке, а не из Synchronize. Возможно в этом проблема?

 

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

В общем решил я свою проблему на планшете - обновил его прошивку и проблема ушла, теперь сую ему несколько больших JSON, "кушает" и не ругается.

PS. Ах да, я ж переписал программу, сам создаю поток и в нем все скачиваю

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

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

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

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

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

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

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

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

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

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

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