Загрузка страниц в Потоке с idHTTP
, Загрузка страниц в Потоке с idHTTP
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.37] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Загрузка страниц в Потоке с idHTTP
, Загрузка страниц в Потоке с idHTTP
|
Сообщ.
#1
,
|
|
|
|
Добрый день. Есть код:
![]() ![]() 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
,
|
|
|
|
Ты член Html используешь еще до того как в него что-то загрузилось. И url нужно устанавливать перед стартом потока.
![]() ![]() 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; |
|
Сообщ.
#3
,
|
|
|
|
Цитата Pcrepair @ Задача была такая: загрузить страницу посредством idHTTP но с использованием класса TThread. Вроде все по теории? По теории - двойка с минусом. |
|
Сообщ.
#4
,
|
|
|
|
balah, спасибо за подсказку
![]() ![]() procedure TLoader.ShowPage; begin Form1.Memo1.Lines.Add(Html); end; идея хорошая, но не пройдет, поскольку в модуле uThreadLoader нет ни формы ни МЕМО разве что сделать в uses модуля ссылку на основную форму Unit1(тогда все работает), но это както по кривому, не должно быть ссылок на основной модуль из дополнительного, где то читал об этом. как то подругому нет варианта передать результат в основную форму? но в общем ошибка понятна - нужна была еще одна процедура. тут еще один вопрос: а функцию вместо процедуры в таких конструкция можно использовать? просмотрел много решений(из интернетума), но везде только процедуры. пробовал в Synchronize вставить функции - РАД пишет что так низзя |
|
Сообщ.
#5
,
|
|
|
|
Цитата Pcrepair @ procedure TLoader.Execute; begin Synchronize(LoadPage); end; Ад и израиль!!!! Ты в курсе зачем вообще нужен Synchronize? |
|
Сообщ.
#6
,
|
|
|
|
вообще вкурсе, но чисто тиоритцки.
а вот сейчас и пробую на практике все расставить по своим местам лучше сообщи свой комментарий на это: Цитата идея хорошая, но не пройдет, поскольку в модуле uThreadLoader нет ни формы ни МЕМО разве что сделать в uses модуля ссылку на основную форму Unit1(тогда все работает), но это както по кривому, не должно быть ссылок на основной модуль из дополнительного, где то читал об этом. как то подругому нет варианта передать результат в основную форму? но в общем ошибка понятна - нужна была еще одна процедура. тут еще один вопрос: а функцию вместо процедуры в таких конструкция можно использовать? просмотрел много решений(из интернетума), но везде только процедуры. пробовал в Synchronize вставить функции - РАД пишет что так низзя |
|
Сообщ.
#7
,
|
|
|
|
Если это на один раз, то сделай ссылку в uses. Если не хочешь - то сделай у TLoader еще одно поле и в нем храни указатель на callback функцию, которую и будешь вызывать в процедуре ShowPage. В callback функции будешь добавлять html в memo или производить какие-то другие манипуляции с отображением. Еще вариант отправить сообщение, на которое будет реагировать твоя форма, но это как-то более запутанно будет выглядеть. Включив фантазию можно и еще что-то придумать, а оно надо...
|
|
Сообщ.
#8
,
|
|
|
|
Цитата Pcrepair @ сделать в uses модуля ссылку на основную форму Unit1(тогда все работает) лажа. Никогда так не делай. У потока вроде есть событие OnTerminate, на него подписывайся и из (Sender as TLoader).Html вытаскивай свою страницу. |