Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки, сокеты и XML 
:(
    Опции темы
knyshow
Дата 5.5.2011, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нужна консультация и опыт старших. Не откажите пожалуйста.

Задача такая: мультисерверный клиент для клиент-серверного приложения (один клиент для всех серверов).
протокол "общения" на основе xml.

Перечитал много документации, но все еще остались не ясными некоторые вопросы:

Вопрос 1. Потоки.
на данном этапе использую класс TThread для каждого сервера, но хочу перейти к потокам средствами WinAPI.

Создание потока:
Код

ThreadHID := BeginThread(nil, 0, @ProcessThread, pointer(i), 0, ThreadID);


Процедура потока:
Код

procedure ProcessThread(param: Pointer)
begin
    repeat
    // ... 
    SomeActions(x, y, z);
    // ...
    until true

    CloseHandle(ThreadHID);
    ThreadHID := 0;
    ThreadID := 0;
end


И некая процедура SomeActions:
Код

procedure SomeActions(const x, y, z: integer)
begin
    //
end;


Вопрос звучит так: если процедура SomeActions будет одновременно запущена из обработчиков ProcessThread двух разных потоков без использования какиз либо методов синхронизации, предпринятых мной... что это получится? будет ли один поток ждать, пока другой поток отработает в этой функции?

Просто в случае с TThread все просто - там эту функцию можно было бы описать внутри класса и вызывать из обработчика Executeю В итоге разные потоки в разных экземплярах класса используют разные функции, а как быть в данном случае?


Вопрос 2. Сокеты.
На данном этапе у меня каждый поток самостоятельно, средствами WinAPI открывает сокет к собственному серверу, коннектится к нему, переводит сокет в неблокирующий режим и в бесконечном цикле в обработчике потока пытается читать с него данные, если они там есть, по необходимости отправлять запросы и т.д.

Проблем, связанны с таким подходом пока не встретил, но сам по себе подход мне кажется каким-то костылем.

Вопрос: будет ли правильным такой подход? Если нет, то подскажите, в какую сторону рыть, посоветуйте более оптимальный вариант.

Вопрос 3. Парсер XML.
Сейчас использую TNativeXML. В общем очень хорош и удобен, но смущает то, что при одновременном парсинге 10 XML-пакетов (в 10 потоках) размером до 26 килобайт каждый, загрузка процессора упирается в 100% на 1-3 секунды.
Страшно представить что будет на 100 потоках - 100% на 30 секунд?

Посоветуйте пожалуйста, если есть на примете, более экономный, быстрый XML-парсер.
Требуется от него не так много:
- хватать XML для разбора из строки, а не только из файла.
- уметь проверь наличие того или иного тега
- работать со списками а-ля 
Код

XMLlist := XML.Root.NodesByName('hfghfhf');
for i := 0 to XMLlist.Count - 1 do
begin
end;



Пока все.
Заранее большое спасибо.
PM MAIL   Вверх
kami
Дата 6.5.2011, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(knyshow @  5.5.2011,  20:55 Найти цитируемый пост)
Вопрос 1. Потоки.на данном этапе использую класс TThread для каждого сервера, но хочу перейти к потокам средствами WinAPI.

Нет смысла. Лучше оставить на Tthread. Хотя - Ваше право.
Цитата(knyshow @  5.5.2011,  20:55 Найти цитируемый пост)
если процедура SomeActions будет одновременно запущена из обработчиков ProcessThread двух разных потоков без использования какиз либо методов синхронизации, предпринятых мной... что это получится? будет ли один поток ждать, пока другой поток отработает в этой функции?

не будет. Если SomeActions "не лезет" за свои пределы, то никто никого ждать не будет (тут все будет зависеть от планировщика потоков Windows), но в то же время - проблем не возникнет.
Цитата(knyshow @  5.5.2011,  20:55 Найти цитируемый пост)
В итоге разные потоки в разных экземплярах класса используют разные функции

Функцию-то используют одну, значения параметров разные smile

Цитата(knyshow @  5.5.2011,  20:55 Найти цитируемый пост)
Вопрос 2. Сокеты....
Проблем, связанны с таким подходом пока не встретил, но сам по себе подход мне кажется каким-то костылем.

Все зависит от количества планируемых подключений. Если их не сотни/тысячи, то такой подход имеет место быть, и даже более чем.
В противном случае - это будет засорение системы ненужным хламом в виде кучи потоков, которые винде нужно обработать, своевременно переключать и т.п. При большом количестве потоков - системе придется тяжко...
Вообще, раньше я пользовался именно этим методом. И считал его единственно верным и правильным (никому не навязываю свое мнение). Теперь же перешел к другой концепции (опять-таки, как вариант, но на текущий момент она меня более чем устраивает):
1 поток задействуется на обработку всех сетевых соединений (чтение/запись, создание/удаление). Ввиду того, что для современных процессоров сетевой обмен является достаточно медленным мероприятием (не беря в расчет 127.0.0.1), одного потока вполне хватает на весьма большую кучу соединений.
2 поток (а вот тут уже зависит от задачи, их может быть несколько) занимается обработкой данных, полученных/передаваемых из/в потока №1. Приводит их к удобоваримому виду и т.п.
3 поток (обычно - основной, т.е. vcl) занимается отображением информации, обработанной потоком №2 и взаимодействием с пользователем.
PM MAIL WWW   Вверх
knyshow
Дата 6.5.2011, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



kami, спасибо за ответ.

Правильно ли я понял:

Поток 1 занимается только и исключительно сокетами: соединение, обработка ошибок соединения, приемом и передачей данных.
Поток 2 занимается полностью всей обработкой принятой информации и формированием пакетов данных для отправки? т.е., по сути Поток 1 накидывает принятые пакеты в буфер Потока 2 для обработки, а Поток 2 накидывает в буфер потока 1 данные для отправки.

Верно?

И вдогонку: Как первый поток читает список сокетов? Это пребор в цикле всех сокетов, и они в неблокируемом режиме или-таки события?

Я бы еще попросил пример обработки нескольких сокетов в одном потоке, если можно...

Это сообщение отредактировал(а) knyshow - 6.5.2011, 14:30
PM MAIL   Вверх
kami
Дата 6.5.2011, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(knyshow @  6.5.2011,  13:39 Найти цитируемый пост)
Правильно ли я понял:

Принцип верен. Реализация может быть разной и меняться время от времени smile При "накидывании" обязательно нужна синхронизация, потому что это (по идее) единственные места, где потоки соприкасаются.

Цитата(knyshow @  6.5.2011,  13:39 Найти цитируемый пост)
Как первый поток читает список сокетов?

Не совсем понял вопрос. А, Вы же пишете на WinAPI... тогда не знаю, чем помочь. Я использую TServer|TClientSocket, которые по сути - минимальная надстройка над API. Там с этим гораздо проще...открыл соединение в контексте дополнительного потока - следовательно все события будут вызываться в контексте этого потока, в результате список сокетов понадобится только для хранения объектов, чтобы своевременно их уничтожать. Но события этих компонентов вызываются при приеме сообщений Windows, посему, думаю, аналогию провести можно.

Цитата(knyshow @  6.5.2011,  13:39 Найти цитируемый пост)
 пример обработки нескольких сокетов в одном потоке, если можно...

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

Это сообщение отредактировал(а) kami - 6.5.2011, 21:26
PM MAIL WWW   Вверх
knyshow
Дата 7.5.2011, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



kami, заранее огромное спасибо. буду ждать.
Цитата

Основная проблема в том, что в моем коде используется собственный протокол обмена...
не заморачивайтесь на протоколе. так или иначе, используете Вы бинарный протокол, XML или ini или... принцип получения и отправки пакетов одинаков
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


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

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


 




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


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

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