| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Сети > TWebBrowser не создается в потоке |
| Автор: Ibragim 9.12.2006, 13:59 | ||||
| День добрый. Вот такой вопрос Если создавать объект TWebBrowser в процедуре обработки формы - все ок Так все ок
А вот если из потока - не работает, поток "зависает" на строке x := TWebBrowser.Create(nil); Где баг? Спасибо за внимание. Так не работает
|
| Автор: Snowy 9.12.2006, 14:06 |
| Ну кто ж создаёт контролы в потоке? Зависание в таких случаях не самый страшный глюк Да и смысл здесь использовать поток? |
| Автор: Ibragim 9.12.2006, 14:18 |
| Без потока никак по смыслу задачи. У меня "ускоритель просмотра сайтов" То есть задача такая: Заранее известно, какие сайты будут просматриваться оператором. Я в куче потоков закачиваю сайты, и те что закачались показываю оператору, он нажимает "Дальше", а следующий сайт (не по очередности в списке, а тот что уже загрузился) тут как тут - осталось только показать, уже все скачано. Счас работает так: гружу с помощью TIdHttp, и когда оператор нажал "Дальше" быстенько сохраняю в файл и говорю единственному контролу TWebBrowser на форме Navigate этот файл. То что нет картинок - не страшно. Но многие сайты таким образом не грузятся - просто белое окошко WebBrowser'a, другие глюки... Причем даже просто експлорером открыая этот сохраненный файл - все равно глюки, не умеет нормально експлорер с локально сохраненным файлом работать. Опера - все ок, да где ж контрол оперовский возьмеш. Ну и тормоза на больших сайтах - просто пока WebBrowser их загрузит даже локально. Вот думаю как модернизировать. |
| Автор: Snowy 9.12.2006, 14:35 |
| Создавай кучу веббраузеров. Загружай в них страницы. А, когда будет нужно, делай их видимыми. |
| Автор: W4FhLF 9.12.2006, 14:53 |
| Т.е. создать визуальный контрол в потоке и работать с его свойствами нереал? |
| Автор: Snowy 9.12.2006, 15:20 |
| Он не будет работать в потоке Все контролы завязаны на TApplication и выполняются только в основном потоке. Так устроена VCL. |
| Автор: Ibragim 9.12.2006, 21:39 |
| Спасибо, вопрос понятен. Будем делать так как советует Snowy |
| Автор: W4FhLF 10.12.2006, 08:41 | ||
Но может быть можно как-нибудь из потоков отправлять сообщению контролу на форме? Просто я в своё время долго пытался сделать многопоточный клиент для RDP, тоже, как только не извращался... Может быть гуру всё-таки подскажет какой-нибудь извращённый способ? На войне, как говорится, все методы |
| Автор: x77 13.12.2006, 14:20 | ||
TWebBrowser - сам по себе работает асинхронно
у тебя этот цикл отработает мгновенно. и управление сразу вернётся основному процессу. а вот уже по мере загрузки будут срабатывать события этого стада Ослов, типа OnNavigationComplete или как оно там, не помню. т.е. десяток браузеров - они уже сами по себе "многопоточные", и в потоки их засовывать не надо, ведь ничего не изменится. второй момент. куча TWebBrowser'ов - это может серьёзно притормозить программу. открой 100 экспловеров и посмотри, что будет с машиной. может быть, есть смысл подумать над тем, чтобы качать сайты через TIdHttp.Get, к примеру, в некий буфер (тот же TStrings), а при просмотре загружать этот буфер в один единственный TWebBrowser. з.ы. индекс забыл, сорри. |