На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

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

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> Загрузка страниц в Потоке с idHTTP , Загрузка страниц в Потоке с idHTTP
    Добрый день. Есть код:

    ExpandedWrap disabled
      unit Unit1;
       
      interface
       
      uses
        Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
        Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
       
      type
        TForm1 = class(TForm)
          Memo1: TMemo;
          ListBox1: TListBox;
          procedure ListBox1DblClick(Sender: TObject);
        private
          { Private declarations }
        public
          { Public declarations }
        end;
       
      var
        Form1: TForm1;
       
      implementation
       
      {$R *.dfm}
      uses uThreadLoader;
       
      procedure TForm1.ListBox1DblClick(Sender: TObject);
      var ThreadLdr: TLoader; HtmlCode:string;
        begin
          ThreadLdr:=Tloader.Create(True); (*создаем поток*)
          ThreadLdr.Priority:=tpNormal;        (*задать приортет нормальный*)
          ThreadLdr.FreeOnTerminate:=True;  (*самовыгрузка в конце потока*)
          ThreadLdr.Resume;  (*запускаю поток - что то устаревшее заменить?*)
          ThreadLdr.Url:=ListBox1.Items[ListBox1.ItemIndex]; (*передаем УРЛ из ЛБ в Поток, все работает*)
          HtmlCode:=ThreadLdr.Html;  (*получаем результат ТУТ ПУСТО!!!*)
          Memo1.Lines.Add(HtmlCode); (*выводим результат в МЕМО*)
        end;
      end.


    и дополнительный модуль

    ExpandedWrap disabled
      unit uThreadLoader;
       
      interface
       
      uses
        System.Classes, idHTTP, SysUtils, Dialogs;
       
      type
       
        TLoader = class(TThread)
        private
          { Private declarations }
        protected
          procedure Execute; override;
          procedure LoadPage;
        public
          Url, Html:string;
        end;
       
      implementation
       
      procedure Tloader.LoadPage;
      var
      Ldr:TidHTTP;
      begin
         Ldr:=TidHTTP.Create(nil);
            Html:=Ldr.Get(Url);
            ShowMessage(Html); (*тут страница есть*)
         FreeAndNil(Ldr);
      end;
       
      procedure TLoader.Execute;
      begin
         Synchronize(LoadPage);
      end;
       
      end.


    Задача была такая: загрузить страницу посредством idHTTP но с использованием класса TThread. Вроде все по теории?
    Вопросы:
    - почему не передается код страницы в HtmlCode:=ThreadLdr.Html;???? УРЛ через переменную доходит до idHTTP, а обратно нет
    - РАД говорит что [dcc32 Warning] Unit1.pas(44): W1000 Symbol 'Resume' is deprecated или устарело. а чем заменить?
      Ты член Html используешь еще до того как в него что-то загрузилось. И url нужно устанавливать перед стартом потока.

      ExpandedWrap disabled
        procedure TForm1.ListBox1DblClick(Sender: TObject);
        var ThreadLdr: TLoader; HtmlCode:string;
          begin
            ThreadLdr:=Tloader.Create(True); (*создаем поток*)
            ThreadLdr.Priority:=tpNormal;        (*задать приортет нормальный*)
            ThreadLdr.FreeOnTerminate:=True;  (*самовыгрузка в конце потока*)
            ThreadLdr.Url:=ListBox1.Items[ListBox1.ItemIndex]; (*передаем УРЛ из ЛБ в Поток, все работает*)
            ThreadLdr.Resume;  (*запускаю поток - что то устаревшее заменить?*)    
          end;
         
         
        procedure Tloader.LoadPage;
        var
           Ldr:TidHTTP;
        begin
           Ldr:=TidHTTP.Create(nil);
           try
               Html:=Ldr.Get(Url);
           finally
               Ldr.free;
           end;
        end;
         
        procedure TLoader.ShowPage;
        begin
           Form1.Memo1.Lines.Add(Html);
        end;
         
         
        procedure TLoader.Execute;
        begin
           LoadPage;
           Synchronize(ShowPage);
        end;
        Цитата Pcrepair @
        Задача была такая: загрузить страницу посредством idHTTP но с использованием класса TThread. Вроде все по теории?

        По теории - двойка с минусом.
          balah, спасибо за подсказку

          ExpandedWrap disabled
            procedure TLoader.ShowPage;
            begin
               Form1.Memo1.Lines.Add(Html);
            end;


          идея хорошая, но не пройдет, поскольку в модуле uThreadLoader нет ни формы ни МЕМО
          разве что сделать в uses модуля ссылку на основную форму Unit1(тогда все работает), но это както по кривому, не должно быть ссылок на основной модуль из дополнительного, где то читал об этом. как то подругому нет варианта передать результат в основную форму?

          но в общем ошибка понятна - нужна была еще одна процедура. тут еще один вопрос: а функцию вместо процедуры в таких конструкция можно использовать? просмотрел много решений(из интернетума), но везде только процедуры. пробовал в Synchronize вставить функции - РАД пишет что так низзя
            Цитата Pcrepair @
            procedure TLoader.Execute;
            begin
               Synchronize(LoadPage);
            end;
             


            Ад и израиль!!!!

            Ты в курсе зачем вообще нужен Synchronize?
              вообще вкурсе, но чисто тиоритцки.
              а вот сейчас и пробую на практике все расставить по своим местам

              лучше сообщи свой комментарий на это:
              Цитата
              идея хорошая, но не пройдет, поскольку в модуле uThreadLoader нет ни формы ни МЕМО
              разве что сделать в uses модуля ссылку на основную форму Unit1(тогда все работает), но это както по кривому, не должно быть ссылок на основной модуль из дополнительного, где то читал об этом. как то подругому нет варианта передать результат в основную форму?

              но в общем ошибка понятна - нужна была еще одна процедура. тут еще один вопрос: а функцию вместо процедуры в таких конструкция можно использовать? просмотрел много решений(из интернетума), но везде только процедуры. пробовал в Synchronize вставить функции - РАД пишет что так низзя
                Если это на один раз, то сделай ссылку в uses. Если не хочешь - то сделай у TLoader еще одно поле и в нем храни указатель на callback функцию, которую и будешь вызывать в процедуре ShowPage. В callback функции будешь добавлять html в memo или производить какие-то другие манипуляции с отображением. Еще вариант отправить сообщение, на которое будет реагировать твоя форма, но это как-то более запутанно будет выглядеть. Включив фантазию можно и еще что-то придумать, а оно надо...
                Сообщение отредактировано: balah -
                  Цитата Pcrepair @
                  сделать в uses модуля ссылку на основную форму Unit1(тогда все работает)

                  лажа. Никогда так не делай. У потока вроде есть событие OnTerminate, на него подписывайся и из (Sender as TLoader).Html вытаскивай свою страницу.
                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0.0815 ]   [ 15 queries used ]   [ Generated: 24.10.26, 05:45 GMT ]