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

Как правильно передать полученные значения в потоке в главную форму приложения?


HyperZen

Вопрос

Как правильно передать полученные значения в потоке (например строку, очень длинную строку) в главную форму приложения? Использовать глобальные переменные? Или есть другой способ?

Использую пример Ярослава: http://fire-monkey.ru/topic/30-фоновое-выполнение-операции-без-замораживания-отрисовки/?controller=topic

Вместо Sleep использую обычное скачивание страницы с интернета при помощи IdHTTP1.Get, записываю результат в какую-то переменную, затем пытаюсь использовать ее в главной форме приложения... Как все-таки правильно?

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

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

  • 0
  • Модераторы
//uses System.Threading;
var
 aData: string;
begin
  TTask.Run(
     procedure 
     begin
        aData := idHttp1.Get('url'); // выполняем загрузку файла из интернета;

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

 

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

Спасибо! Но в примере Ярослава более "наглядно", что ли, выглядит код. Там сразу понятно где запускать анимацию индикатора, где тормозить ее. Как быть с использованием TTask и индикатора?!

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

Спасибо!

Немного перефразирую вопрос: у меня имеется процедура, в которой происходит закачка страницы с интернета. В ней же - происходит поиск нужной мне информации регулярными выражениями. Далее, в ней же - очистка от лишних символов. И заполнение TListView.

Хочу "обернуть" момент закачки страницы в TAniIndicator. Интегрирую данный код с использованием TTask (место, где идет закачка страницы). Получаю exception на регулярных выражениях (это, видимо, потому, что еще не скачана страница целиком). Как сделать так, чтобы шла закачка страницы, показывался индикатор, а моя процедура - выполнялась позже. Есть ли возможность как-то "дождаться" закачки страницы, а затем выполнять код процедуры далее?

И как вообще правильно поступать в таких случаях?

Ссылка на комментарий
  • 0
procedure Parsing(URLToPars: string; aListView: TListView);
var
  TempText : string;
  HeadMatches, MsgMatches: TMatchCollection;
  CountPagesMatch: TMatch;
  i: Integer;
  HeadRegularExprString : string;
  MsgRegularExprString : string;
begin
  try

// вот это место, которое хотелось бы видеть с в потоке и с индикатором:

    HTMLText := IdHTTP1.Get(URLToPars); // выполняем загрузку файла из интернета;

// вот это место, которое хотелось бы видеть с индикатором



    aListView.Items.Clear;

        CountPagesMatch := TRegEx.Match(HTMLText, 'max="(.*?)".*value="(.*?)"');

       HeadRegularExprString := 'class="date">(.*?)<.*?class="id">(.*?)<';

      MsgRegularExprString := 'class="text">(.*?)<\/div>';

    HeadMatches := TRegEx.Matches(HTMLText, HeadRegularExprString, [roIgnoreCase, roMultiLine]);

    MsgMatches := TRegEx.Matches(HTMLText, MsgRegularExprString, [roIgnoreCase, roMultiLine]);

    if HeadMatches.Count = MsgMatches.Count then
      begin
          for i := 0 to HeadMatches.Count - 1 do
            begin
              TempText := HTMLClear(MsgMatches.Item.Groups[1].Value);
  
              with aListView.Items.Add do
                begin
                  Data['DateText'] := HeadMatches.Item.Groups[1].Value;
                  Data['CitateText'] := HeadMatches.Item.Groups[2].Value;
                  Data['MainText'] := TempText;
                  Data['imgCopy'] := il1.Bitmap(TSizeF.Create(36, 36),0);
                  Data['imgSend'] := il1.Bitmap(TSizeF.Create(36, 36),1);
                end;

            end;
      end
        else
          ShowMessage('Ошибка загрузки данных!');

    except
      On E: Exception do
         ShowMessage('Ошибка: ' + E.Message);
    end;
end;

 

Изменено пользователем HyperZen
Ссылка на комментарий
  • 0
  • Модераторы
procedure Parsing(URLToPars: string; aListView: TListView);
var
  TempText: string;
  HeadMatches, MsgMatches: TMatchCollection;
  CountPagesMatch: TMatch;
  i: Integer;
  HeadRegularExprString: string;
  MsgRegularExprString: string;
begin
  // вот это место, которое хотелось бы видеть с в потоке и с индикатором:
  <form1>.AniIndicator1.Enabled := true;
  // вот это место, которое хотелось бы видеть с индикатором
  TTask.Run(
    procedure
    begin
      HTMLText := IdHTTP1.Get(URLToPars); // выполняем загрузку файла из интернета;

      TThread.Synchronize(TThread.CurrentThread,
        procedure
        begin
          aListView.Items.Clear;
          CountPagesMatch := TRegEx.Match(HTMLText, 'max="(.*?)".*value="(.*?)"');
          HeadRegularExprString := 'class="date">(.*?)<.*?class="id">(.*?)<';
          MsgRegularExprString := 'class="text">(.*?)<\/div>';
          HeadMatches := TRegEx.Matches(HTMLText, HeadRegularExprString, [roIgnoreCase, roMultiLine]);
          MsgMatches := TRegEx.Matches(HTMLText, MsgRegularExprString, [roIgnoreCase, roMultiLine]);
          if HeadMatches.Count = MsgMatches.Count then
          begin
            for i := 0 to HeadMatches.Count - 1 do
            begin
              TempText := HTMLClear(MsgMatches.Item.Groups[1].Value);
              with aListView.Items.Add do
              begin
                Data['DateText'] := HeadMatches.Item.Groups[1].Value;
                Data['CitateText'] := HeadMatches.Item.Groups[2].Value;
                Data['MainText'] := TempText;
                Data['imgCopy'] := il1.Bitmap(TSizeF.Create(36, 36), 0);
                Data['imgSend'] := il1.Bitmap(TSizeF.Create(36, 36), 1);
              end;
            end;
          end
          else
            ShowMessage('Ошибка загрузки данных!');

          <form1>.AniIndicator1.Enabled := false;
        end);
    end);
end;

 

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

procedure Parsing(URLToPars: string; aListView: TListView);
var
  TempText: string;
  HeadMatches, MsgMatches: TMatchCollection;
  CountPagesMatch: TMatch;
  i: Integer;
  HeadRegularExprString: string;
  MsgRegularExprString: string;
begin
  // вот это место, которое хотелось бы видеть с в потоке и с индикатором:
  <form1>.AniIndicator1.Enabled := true;
  // вот это место, которое хотелось бы видеть с индикатором
  TTask.Run(
    procedure
    begin
      HTMLText := IdHTTP1.Get(URLToPars); // выполняем загрузку файла из интернета;

      CountPagesMatch := TRegEx.Match(HTMLText, 'max="(.*?)".*value="(.*?)"');
      HeadRegularExprString := 'class="date">(.*?)<.*?class="id">(.*?)<';
      MsgRegularExprString := 'class="text">(.*?)<\/div>';
      HeadMatches := TRegEx.Matches(HTMLText, HeadRegularExprString, [roIgnoreCase, roMultiLine]);
      MsgMatches := TRegEx.Matches(HTMLText, MsgRegularExprString, [roIgnoreCase, roMultiLine]);

      TThread.Synchronize(TThread.CurrentThread,
        procedure
        begin
          aListView.Items.Clear;
          if HeadMatches.Count = MsgMatches.Count then
          begin
            for i := 0 to HeadMatches.Count - 1 do
            begin
              TempText := HTMLClear(MsgMatches.Item.Groups[1].Value);
              with aListView.Items.Add do
              begin
                Data['DateText'] := HeadMatches.Item.Groups[1].Value;
                Data['CitateText'] := HeadMatches.Item.Groups[2].Value;
                Data['MainText'] := TempText;
                Data['imgCopy'] := il1.Bitmap(TSizeF.Create(36, 36), 0);
                Data['imgSend'] := il1.Bitmap(TSizeF.Create(36, 36), 1);
              end;
            end;
          end
          else
            ShowMessage('Ошибка загрузки данных!');

          <form1>.AniIndicator1.Enabled := false;
        end);
    end);
end;

 

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

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

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

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

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

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

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

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

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

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

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