Распараллелить vcl

beretta2207

Навеяно предыдущей проблемой.
Каким образом можно в рамках одной программы запустить параллельно несколько vcl-ных потоков?
Дано: есть программа, которая при помощи компонента (дело происходит в 7 Delphi) TEmbeddedWB (обёртки для библиотеки mshtml.dll - реализующей функциональность IE) собирает некоторую статистику с сайта. Проблема в том, что на оду страницу тратиться примерно около 2 секунд. Страниц более 30000. В результате возникла идея (предполагая, что большая часть этого времени не есть какие-то вычисления, а просто установка соединения использовать сразу несколько компонентов TEmbeddedWB, но, в чём загвоздка, метод Navigate2 в потоке нельзя выполнить, только через Synchronize, что убивает пользу от распараллеливания.
Расскажите как, либо посоветуйте какой-нибудь невизуальный компонент для парсинга html (очень желательно, что бы онм не работал со своим внутреннним представлением а с DHTML, что бы можно было сразу из него вытащить интефейс IHTMLDocument2 )

banderon

Расскажите как, либо посоветуйте какой-нибудь невизуальный компонент для парсинга html
А что конкретно должен уметь парсер html?

ppplva

невизуальный компонент для парсинга html
htmltidy + любой (невизуальный )xml-парсер.

beretta2207

а)Предоставлять документ в виде иерархической структуры ( )
б) Уметь делать выборку всех подструктур по имени тега (например всех таблиц TABLE)
в) Хранить атрибуты тегов, а желательно, уметь делать выборку всех тегов указанного типа с указанным атрибутом и его значением
г) И, само собой разумеется, быть взаимооднозначным представлением html-документа (то есть, хранить все тексты, ссылки и.т.д.)

beretta2207

Прчём здесь htmltidy? Это же утилита для проверки корректности html-документа
Например? Какой xml-парсер стоит использовать?

Maurog

оффтопик:
html не обязан парсится хмл-парсером.
там могут быть незакрытые теги =\

ppplva

Не только, оно бывает в виде библиотеки, и превращает любое г. в валидный xml. А потом - парсером, для xml их явно больше, чем для html. Хз какие там для дельфей есть, я думал они уже давно тихо скончались.

beretta2207

Не могут, а они есть, притом в изрядном количестве, во всяком случае, в тех файлах что я собираюсь парсить)

Maurog

Не могут, а они есть
что ты сказал?
я утверждаю, что в хтмл могут быть незакрытые теги (из-за чего хмл-парсер выдает ошибку однако браузер корректно распарсит(сам закроет незакрытые теги) и покажет страничку.

beretta2207

Я усиливаю твоё утверждение
А я утверждаю, что в тех документах которые мне надо парсить, встречается огромное число незакрытых тегов

Dimon89

Я может не в теме, но... А что мешает создавать компонент внутри потока и там же навигейтиться и парсить? Метод синхронизации, насколько помню, нужен только для правильной перерисовки визуальных элементов формы, всё остальное можно делать в потоке.

Andbar

Я может не в теме, но... А что мешает создавать компонент внутри потока и там же навигейтиться и парсить? Метод синхронизации, насколько помню, нужен только для правильной перерисовки визуальных элементов формы, всё остальное можно делать в потоке.
По идее можно, если компонент не пытается взаимодействовать с vcl-компонентами (это может произойти даже если создавать его без указания родителя).
На счет изначального вопроса.
Мне приходилось запускать vcl в не основном потоке (код содержался в dll-ке, которая должна была возвращать управление сразу). Пришлось применять массу изощрений, пока я заставил это дело работать корректно в любой ситуации. Соответственно в механизме взаимодействия потоков пришлось подробно разбираться. Так вот, что касается D7, без модификации кода VCL запустить два полноценных vcl-ных потока не получится, т.к. для синхронизации потоков используются глобальные переменные, недоступные извне. У меня в связи с этим возникла проблема корректного закрытия окон в правильном потоке (DestroyWindow работает только из потока, в котором был вызов CreateWindow/CreateWindowEx).
Так что ищите thread-safe решения.
Оставить комментарий
Имя или ник:
Комментарий: