Распараллелить vcl
Расскажите как, либо посоветуйте какой-нибудь невизуальный компонент для парсинга htmlА что конкретно должен уметь парсер html?
невизуальный компонент для парсинга htmlhtmltidy + любой (невизуальный )xml-парсер.
б) Уметь делать выборку всех подструктур по имени тега (например всех таблиц TABLE)
в) Хранить атрибуты тегов, а желательно, уметь делать выборку всех тегов указанного типа с указанным атрибутом и его значением
г) И, само собой разумеется, быть взаимооднозначным представлением html-документа (то есть, хранить все тексты, ссылки и.т.д.)
Например? Какой xml-парсер стоит использовать?
html не обязан парсится хмл-парсером.
там могут быть незакрытые теги =\
Не только, оно бывает в виде библиотеки, и превращает любое г. в валидный xml. А потом - парсером, для xml их явно больше, чем для html. Хз какие там для дельфей есть, я думал они уже давно тихо скончались.
Не могут, а они есть, притом в изрядном количестве, во всяком случае, в тех файлах что я собираюсь парсить)
Не могут, а они естьчто ты сказал?
я утверждаю, что в хтмл могут быть незакрытые теги (из-за чего хмл-парсер выдает ошибку однако браузер корректно распарсит(сам закроет незакрытые теги) и покажет страничку.
А я утверждаю, что в тех документах которые мне надо парсить, встречается огромное число незакрытых тегов
Я может не в теме, но... А что мешает создавать компонент внутри потока и там же навигейтиться и парсить? Метод синхронизации, насколько помню, нужен только для правильной перерисовки визуальных элементов формы, всё остальное можно делать в потоке.
Я может не в теме, но... А что мешает создавать компонент внутри потока и там же навигейтиться и парсить? Метод синхронизации, насколько помню, нужен только для правильной перерисовки визуальных элементов формы, всё остальное можно делать в потоке.По идее можно, если компонент не пытается взаимодействовать с vcl-компонентами (это может произойти даже если создавать его без указания родителя).
На счет изначального вопроса.
Мне приходилось запускать vcl в не основном потоке (код содержался в dll-ке, которая должна была возвращать управление сразу). Пришлось применять массу изощрений, пока я заставил это дело работать корректно в любой ситуации. Соответственно в механизме взаимодействия потоков пришлось подробно разбираться. Так вот, что касается D7, без модификации кода VCL запустить два полноценных vcl-ных потока не получится, т.к. для синхронизации потоков используются глобальные переменные, недоступные извне. У меня в связи с этим возникла проблема корректного закрытия окон в правильном потоке (DestroyWindow работает только из потока, в котором был вызов CreateWindow/CreateWindowEx).
Так что ищите thread-safe решения.
Оставить комментарий
beretta2207
Навеяно предыдущей проблемой.Каким образом можно в рамках одной программы запустить параллельно несколько vcl-ных потоков?
Дано: есть программа, которая при помощи компонента (дело происходит в 7 Delphi) TEmbeddedWB (обёртки для библиотеки mshtml.dll - реализующей функциональность IE) собирает некоторую статистику с сайта. Проблема в том, что на оду страницу тратиться примерно около 2 секунд. Страниц более 30000. В результате возникла идея (предполагая, что большая часть этого времени не есть какие-то вычисления, а просто установка соединения использовать сразу несколько компонентов TEmbeddedWB, но, в чём загвоздка, метод Navigate2 в потоке нельзя выполнить, только через Synchronize, что убивает пользу от распараллеливания.
Расскажите как, либо посоветуйте какой-нибудь невизуальный компонент для парсинга html (очень желательно, что бы онм не работал со своим внутреннним представлением а с DHTML, что бы можно было сразу из него вытащить интефейс IHTMLDocument2 )