Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > TWebBrowser не создается в потоке


Автор: Ibragim 9.12.2006, 13:59
День добрый. Вот такой вопрос
Если создавать объект TWebBrowser в процедуре обработки формы - все ок

Так все ок
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  x: TWebBrowser;
begin
  x := TWebBrowser.Create(nil);
  x.Navigate('www.ya.ru');
  x.ParentWindow := Form1.Handle;
end;


А вот если из потока - не работает, поток "зависает" на строке   x := TWebBrowser.Create(nil);
Где баг? Спасибо за внимание.

Так не работает
Код

TTestThread = class(TThread)
  procedure Execute; override;
end;

procedure TTestThread.Execute;
var
  x: TWebBrowser;
begin
  x := TWebBrowser.Create(nil);
  x.Navigate('www.ya.ru');
  x.ParentWindow := Form1.Handle;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  x: TTestThread;
begin
  x := TTestThread.Create(false);
end;

Автор: Snowy 9.12.2006, 14:06
Ну кто ж создаёт контролы в потоке?
Зависание в таких случаях не самый страшный глюк smile
Да и смысл здесь использовать поток?

Автор: Ibragim 9.12.2006, 14:18
Без потока никак по смыслу задачи.
У меня "ускоритель просмотра сайтов" smile 
То есть задача такая: Заранее известно, какие сайты будут просматриваться оператором. Я в куче потоков закачиваю сайты, и те что закачались показываю оператору, он нажимает "Дальше", а следующий сайт (не по очередности в списке, а тот что уже загрузился) тут как тут - осталось только показать, уже все скачано. 

Счас работает так: гружу с помощью TIdHttp, и когда оператор нажал "Дальше" быстенько сохраняю в файл и говорю единственному контролу TWebBrowser на форме Navigate этот файл. То что нет картинок - не страшно. Но многие сайты таким образом не грузятся - просто белое окошко WebBrowser'a, другие глюки... Причем даже просто експлорером открыая этот сохраненный файл - все равно глюки, не умеет нормально експлорер с локально сохраненным файлом работать. Опера - все ок, да где ж контрол оперовский возьмеш. Ну и тормоза на больших сайтах - просто пока WebBrowser их загрузит даже локально. Вот думаю как модернизировать.

Автор: Snowy 9.12.2006, 14:35
Создавай кучу веббраузеров.
Загружай в них страницы.
А, когда будет нужно, делай их видимыми.

Автор: W4FhLF 9.12.2006, 14:53
Т.е. создать визуальный контрол в потоке и работать с его свойствами нереал?

Автор: Snowy 9.12.2006, 15:20
Он не будет работать в потоке smile
Все контролы завязаны на TApplication и выполняются только в основном потоке.
Так устроена VCL.

Автор: Ibragim 9.12.2006, 21:39
Спасибо, вопрос понятен. Будем делать так как советует Snowy

Автор: W4FhLF 10.12.2006, 08:41
Цитата

Он не будет работать в потоке 


Но может быть можно как-нибудь из потоков отправлять сообщению контролу на форме? 
Просто я в своё время долго пытался сделать многопоточный клиент для RDP, тоже, как только не извращался... 
Может быть гуру всё-таки подскажет какой-нибудь извращённый способ? На войне, как говорится, все методыsmile

Автор: Snowy 10.12.2006, 11:18
Цитата(W4FhLF @  10.12.2006,  08:41 Найти цитируемый пост)
Но может быть можно как-нибудь из потоков отправлять сообщению контролу на форме? 
Можно. Но для какой цели? Это уже другая тема.
В данном случае это ничего не даёт.

Автор: x77 13.12.2006, 14:20
TWebBrowser - сам по себе работает асинхронно smile если ты скажешь

Код

for i := 0 to 1000
  WebBrowsers [i].Navigate ('...');


у тебя этот цикл отработает мгновенно. и управление сразу вернётся основному процессу. а вот уже по мере загрузки будут срабатывать события этого стада Ослов, типа OnNavigationComplete или как оно там, не помню. т.е. десяток браузеров - они уже сами по себе "многопоточные", и в потоки их засовывать не надо, ведь ничего не изменится.

второй момент. куча TWebBrowser'ов - это может серьёзно притормозить программу. открой 100 экспловеров и посмотри, что будет с машиной. может быть, есть смысл подумать над тем, чтобы качать сайты через TIdHttp.Get, к примеру, в некий буфер (тот же TStrings), а при просмотре загружать этот буфер в один единственный TWebBrowser.

з.ы. индекс забыл, сорри.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)