|
Распараллелить vcl
21.05.2007 20:43
|
|
|
Навеяно предыдущей проблемой. Каким образом можно в рамках одной программы запустить параллельно несколько vcl-ных потоков? Дано: есть программа, которая при помощи компонента (дело происходит в 7 Delphi) TEmbeddedWB (обертки для библиотеки mshtml.dll - реализующей функциональность IE) собирает некоторую статистику с сайта. Проблема в том, что на оду страницу тратиться примерно около 2 секунд. Страниц более 30000. В результате возникла идея (предполагая, что большая часть этого времени не есть какие-то вычисления, а просто установка соединения), использовать сразу несколько компонентов TEmbeddedWB, но, в чем загвоздка, метод Navigate2 в потоке нельзя выполнить, только через Synchronize, что убивает пользу от распараллеливания. Расскажите как, либо посоветуйте какой-нибудь невизуальный компонент для парсинга html (очень желательно, что бы онм не работал со своим внутреннним представлением а с DHTML, что бы можно было сразу из него вытащить интефейс IHTMLDocument2 )
|
|
Jerry
|
Санек
|
|
|
|
Рег.: 14.03.2004
|
Сообщений: 1360
|
Из: Москва
|
Рейтинг: 501
|
|
|
В ответ на:
Расскажите как, либо посоветуйте какой-нибудь невизуальный компонент для парсинга html
А что конкретно должен уметь парсер html?
|
|
Kai
|
|
|
|
|
Рег.: 25.10.2002
|
Сообщений: 8251
|
|
Рейтинг: 818
|
|
|
Quote:
невизуальный компонент для парсинга html
htmltidy + любой (невизуальный )xml-парсер.
|
|
|
Re: Распараллелить vcl
[re: Jerry]
21.05.2007 22:53
|
|
|
а)Предоставлять документ в виде иерархической структуры ( ) б) Уметь делать выборку всех подструктур по имени тега (например всех таблиц TABLE) в) Хранить атрибуты тегов, а желательно, уметь делать выборку всех тегов указанного типа с указанным атрибутом и его значением г) И, само собой разумеется, быть взаимооднозначным представлением html-документа (то есть, хранить все тексты, ссылки и.т.д.)
|
|
|
Re: Распараллелить vcl
[re: Kai]
21.05.2007 22:59
|
|
|
Прчем здесь htmltidy? Это же утилита для проверки корректности html-документа Например? Какой xml-парсер стоит использовать?
|
|
horror
|
гонобобель
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 3784
|
|
Рейтинг: 2137
|
|
Re: Распараллелить vcl
[re: Kai]
21.05.2007 23:00
|
|
|
оффтопик: html не обязан парсится хмл-парсером. там могут быть незакрытые теги =\
|
|
Kai
|
|
|
|
|
Рег.: 25.10.2002
|
Сообщений: 8251
|
|
Рейтинг: 818
|
|
|
Не только, оно бывает в виде библиотеки, и превращает любое г. в валидный xml. А потом - парсером, для xml их явно больше, чем для html. Хз какие там для дельфей есть, я думал они уже давно тихо скончались.
|
|
|
Re: Распараллелить vcl
[re: horror]
21.05.2007 23:07
|
|
|
Не могут, а они есть, притом в изрядном количестве, во всяком случае, в тех файлах что я собираюсь парсить)
|
|
horror
|
гонобобель
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 3784
|
|
Рейтинг: 2137
|
|
|
Quote:
Не могут, а они есть
что ты сказал? я утверждаю, что в хтмл могут быть незакрытые теги (из-за чего хмл-парсер выдает ошибку), однако браузер корректно распарсит(сам закроет незакрытые теги) и покажет страничку.
Редактировал horror (21.05.2007 23:13)
|
|
|
Re: Распараллелить vcl
[re: horror]
21.05.2007 23:42
|
|
|
Я усиливаю твое утверждение А я утверждаю, что в тех документах которые мне надо парсить, встречается огромное число незакрытых тегов)))
|
|
Grey_DeMonstr
|
Software Fiend
|
|
|
|
Рег.: 04.04.2005
|
Сообщений: 5522
|
Из: .
|
Рейтинг: 2400
|
|
|
Я может не в теме, но... А что мешает создавать компонент внутри потока и там же навигейтиться и парсить? Метод синхронизации, насколько помню, нужен только для правильной перерисовки визуальных элементов формы, все остальное можно делать в потоке.
|
У меня все работает. Что я делаю неправильно? Сага об XYZ |
|
Rad
|
delinquent guy
|
|
|
|
Рег.: 06.09.2005
|
Сообщений: 17291
|
Из: here and there
|
Рейтинг: 2232
|
|
|
В ответ на:
Я может не в теме, но... А что мешает создавать компонент внутри потока и там же навигейтиться и парсить? Метод синхронизации, насколько помню, нужен только для правильной перерисовки визуальных элементов формы, все остальное можно делать в потоке.
По идее можно, если компонент не пытается взаимодействовать с vcl-компонентами (это может произойти даже если создавать его без указания родителя).
На счет изначального вопроса. Мне приходилось запускать vcl в не основном потоке (код содержался в dll-ке, которая должна была возвращать управление сразу). Пришлось применять массу изощрений, пока я заставил это дело работать корректно в любой ситуации. Соответственно в механизме взаимодействия потоков пришлось подробно разбираться. Так вот, что касается D7, без модификации кода VCL запустить два полноценных vcl-ных потока не получится, т.к. для синхронизации потоков используются глобальные переменные, недоступные извне. У меня в связи с этим возникла проблема корректного закрытия окон в правильном потоке (DestroyWindow работает только из потока, в котором был вызов CreateWindow/CreateWindowEx). Так что ищите thread-safe решения.
|
|
|