Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.12.2012, 23:10
Pcrepair
 
Сообщения: n/a
По умолчанию Загрузка страниц в Потоке с idHTTP

Добрый день. Есть код:

Код:
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.

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

Код:
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 или устарело. а чем заменить?
Ответить с цитированием
  #2  
Старый 12.12.2012, 08:00
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Pcrepair
Есть код:
Код:
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;
Во-первых порядок действий такой: сначала создаёшь объект потока остановленным, настраиваешь ему нужные параметры и потом запускаешь его на выполнение с помощью Resume. Т.е после того как поток запущен - уже поздно его "донастраивать" (речь идёт о присвоении Url после Resume).
Во-вторых почему ты сразу пытаешься прочитать из объекта потока значение поля Html? После Resume дополнительный поток живёт своей жизнью, а главный поток своей. Почему ты думаешь, что когда в главном потоке дело дойдёт до строки "HtmlCode:=ThreadLdr.Html" то дополнительный поток уже успеет скачать страницу?
В-третьих зачем ты вообще пытаешь в главном потоке прочитать у объекта потока значение поля Html? Возможно что когда в главном потоке дело дойдёт до строки "HtmlCode:=ThreadLdr.Html" то дополнительный поток уже успеет и скачать страницу и разрушить свой объект (у тебя он саморазрушаемый: FreeOnTerminate:=True) и поэтому переменная ThreadLdr будет указывать в никуда (точнее она будет указывать на то место, где раньше был объект, а теперь "руины" от него, при обращении к которым в программе может случиться "авария" типа Access Violation). Другими словами так как страницу качает дополнительный поток, то значит именно он знает когда страница закачалась, а значит именно ему решать кода уже можно "публиковать" эту страницу в Memo1 (или куда-то там ещё), а вовсе не главному потоку.
Цитата:
Сообщение от Pcrepair
Код:
procedure TLoader.Execute;
begin
   Synchronize(LoadPage);
end;
И какой был смысл создавать дополнительный поток? Метод Synchronize приостанавливает дополнительный поток и выполняет метод LoadPage в главном потоке, а значит качать будет опять главный поток. С тем же успехом можно было не создавая никаких потоков просто качать в обработчике ListBox1DblClick.
Ответить с цитированием
  #3  
Старый 12.12.2012, 09:23
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

в кратце:
-создай новый конструктор у наследника TThread
-передавай url и Handle формы в конструктор и сохраняй значение в наследнике
-FreeOnTerminate присвоить в конструкторе False
-всю работу с TIdHTTP перенести в Execute
-после завершения Get уведомлять форму об окончании работы, посылкой сообщения, к примеру
-в обработчике считать результат и удалить объект потока
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter