Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> многопоточность и статические класс, или как получить указатель на дин.метод 
V
    Опции темы
webprofusa
Дата 15.11.2011, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.10.2011

Репутация: нет
Всего: нет



Добрый день!
Заранее сори, крайне плохо знаю язык и его возможности.
Задача
Создать многопоточный парсинг xml файлов используя SAX2, при этом без использования сторонних библиотек(только libxml2). Структура xml заранее неизвестна (т.е. фактически перегон xml в массив)
Домыслы
почитав документацию нашел такой пример:
Код

   xmlSAXHandler saxHandler;
   memset( &saxHandler, 0, sizeof(saxHandler) );
   saxHandler.initialized = XML_SAX2_MAGIC;
   saxHandler.startElementNs = &mySaxParser::startElementNs;
   saxHandler.endElementNs = &mySaxParser::endElementNs;
   saxHandler.warning = &mySaxParser::warning;
   saxHandler.error = &mySaxParser::error;
   int result = xmlSAXUserParseMemory( &saxHandler, &mySaxParser, xml.c_str(), int(xml.length()) );

чтож, здорово) примерно также я делал в php. При этом в классе mySaxParser можно объявить массивы открытых тегов, а также результирующий массив(в который будем сваливать значения тегов при их закрытии в методе endElementNs). Ну и таким образом можно создать достаточно быстрый модуль перегона xml в массив. Все это хозяйство должно работать в много потоков, поэтому конечно нужно для каждого потока создавать свой экземпляр класса mySaxParser, ну и соотвественно устанавливать хендлеры нужных функций именно из созданного экземпляра(чтобы данные парарлельных потоков не перемешивались)... и вот тут начинаются проблемы...
Проблемы
У меня никак не получается присвоить saxHandler.startElementNs указатель на метод экземпляра класса mySaxParser, пробовал по всякому обгуглился уже в край, ничего не помогает( saxHandler.startElementNs - желает работать только со статическими методами =(
Окей, грешен, на всякий случай попробовал использовать статический класс mySaxParser в нескольких потоках, как я и предполагал, значения свойств класса оказались общими между потоками( (т.е. происходило переприсваивание)
Вопросы
1) как мне присвоить saxHandler.startElementNs указатель на метод(не статический) экземпляра класса mySaxParser? - это в принципе возможно?
2) возможно можно как-то для разных потоков избжать перприсваивания свойств статического класса? (хотя мозгом понимаю, какая эта глупость, но коль другого выхода нет)

Добавлено через 8 минут и 33 секунды
Да, вот описание функции saxHandler.startElementNs
Код

Function type: startElementNsSAX2Func
void    startElementNsSAX2Func        (void * ctx, 
                     const xmlChar * localname, 
                     const xmlChar * prefix, 
                     const xmlChar * URI, 
                     int nb_namespaces, 
                     const xmlChar ** namespaces, 
                     int nb_attributes, 
                     int nb_defaulted, 
                     const xmlChar ** attributes)

PM MAIL   Вверх
bsa
Дата 15.11.2011, 15:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(webprofusa @  15.11.2011,  15:57 Найти цитируемый пост)
1) как мне присвоить saxHandler.startElementNs указатель на метод(не статический) экземпляра класса mySaxParser? - это в принципе возможно?
нет
Цитата(webprofusa @  15.11.2011,  15:57 Найти цитируемый пост)
2) возможно можно как-то для разных потоков избжать перприсваивания свойств статического класса? (хотя мозгом понимаю, какая эта глупость, но коль другого выхода нет)
да

вторым параметром функции xmlSAXUserParseMemory передается некий указатель ctx (context).  Этот указатель передается в неизменном виде каждой твоей функции, которую вызывает парсер. Таким образом, ты должен сделать статические методы-обертки, которые будут преобразовывать void *ctx в mySaxParser *msp, а затем вызывать уже нестатический метод конкретного объекта. И именно эти обертки присваивать элементам структуры xmlSAXHandler.
Пример: http://gaiacrtn.free.fr/articles/libxml2_sax2.html

Это сообщение отредактировал(а) bsa - 15.11.2011, 15:45
PM   Вверх
webprofusa
Дата 15.11.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.10.2011

Репутация: нет
Всего: нет



Вау супер!
Спасибо огромное за исчерпывающий ответ) 
PM MAIL   Вверх
xvr
Дата 16.11.2011, 14:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(webprofusa @  15.11.2011,  14:57 Найти цитируемый пост)
Создать многопоточный парсинг xml файлов используя SAX2, при этом без использования сторонних библиотек(только libxml2). Структура xml заранее неизвестна (т.е. фактически перегон xml в массив)

А можно вопрос? В чем глубокий смысл использования SAX, что бы потом все равно загрузить весь xml в память? Почему сразу не взять DOM (или то, что под этим понимает libxml2)?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.