Можно ли использовать TWebBrowser в потоке в Delphi без Application.ProcessMessages?

Я пытаюсь создать снимки экрана веб-страниц в серверном приложении Delphi (XE2) с помощью TWebBrowser. Снимки экрана инициируются вызовами веб-службы на мой сервер, поэтому для сохранения масштабируемости я хотел бы обслуживать запросы, не полагаясь на критические разделы или сообщения Application.ProcessMessages для рендеринга веб-страницы.

Можно ли это сделать с помощью TWebBrowser?


person Andy    schedule 15.07.2013    source источник
comment
Я не понимаю, почему бы и нет. Application.Processmessages, безусловно, никогда не нужен. Подсказка: взгляните на событие DocumentComplete.   -  person whosrdaddy    schedule 15.07.2013
comment
@whosrdaddy, ты уверен? Типичные примеры использования TWebBrowser должны обрабатывать сообщения, чтобы элемент управления инициализировался и выполнял свою внутреннюю работу. Либо приложение бездействует во время обработки сообщений, либо вы вызываете ProcessMessages. Для сервера я не уверен, насколько надежно он может простаивать в ожидании обработки запроса. Энди, попробуйте вместо этого встроить Chrome.   -  person David    schedule 15.07.2013
comment
Похоже, этот вопрос уже задавали несколько раз. Например: stackoverflow.com/questions/3735410/   -  person David Heffernan    schedule 16.07.2013
comment
@DavidM: Chrome занимает очень много места, которого я хотел бы избежать в своем приложении, если это возможно (отсюда и мой первоначальный вопрос о TWebbrowser).   -  person Andy    schedule 16.07.2013
comment
@DavidHeffernan: я пометил вопрос, на который вы ссылались, с помощью TWebBrowser, чтобы его было легче найти в будущем.   -  person Andy    schedule 16.07.2013
comment
Я бы остановился на хроме. он включает компонент закадрового рендеринга. (см. демонстрации) основная проблема с TWebBrowser IMO заключается в том, что даже если он будет работать из другого потока без дескриптора окна, по умолчанию он не сможет отображать страницы в стандартах IE8+ (включение этого мир боли с ИЭ). не говоря уже о стандартах HTML5...:/   -  person kobik    schedule 09.01.2014


Ответы (2)


Я уже сделал это в ряде объектов, и, к сожалению, объект TWebBrowser очень сильно связан со своим родительским объектом и, в частности, с его дескриптором HWND. (см. также TWebBrowser.HandleNeeded)

Наилучшие результаты, которые я получил, заключались в инкапсуляции TWebBrowser и формы в библиотеке ActiveX, поэтому «насос сообщений» за ним отделен от основного приложения. Таким образом, ActiveX/COM обрабатывает все вопросы потоковой передачи и синхронизации.

person Stijn Sanders    schedule 16.07.2013
comment
Это печально, но похоже на реальность. Я поэкспериментирую с подходом ActiveX и доложу, если мне это удастся. Спасибо за вашу помощь. - person Andy; 16.07.2013

Попробуйте поместить TWebbrowser в отдельный exe. Это переместит это в другой поток/процесс, и вы получите модульность, масштабируемость и производительность. Веб-служба может взаимодействовать с процессом, у которого есть веб-браузер, используя IPC или обмен сообщениями.

Используйте систему очередей для отслеживания назначения и выполнения задач захвата в процессе захвата экрана или запускайте исполняемый файл для каждого сайта для захвата.

Еще одно преимущество, которое вы получаете, используя этот метод, заключается в том, что в случае сбоя программы захвата веб-служба по-прежнему будет доступна для приема запросов. Веб-сервис может проверить, находится ли exe-процесс в памяти, прежде чем назначать задачу, и если он не находится (разбился или не запущен), он может запустить exe-файл самостоятельно.

person Ali    schedule 08.01.2014