![]() |
|
Модераторы: gambit |
![]()
|
|
| iddqd |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 16.11.2005 Репутация: нет Всего: 2 |
Этот сервер отлично работает. Но в один момент клиент начинает ему посылать команду "POS" очень быстро. Более 5-ти команд в секунду и сервер не успевает их обрабатывать, не помогло даже создание очереди, пакеты смешиваются. Пожалуйста, скажите, как можно синхронизировать их действия? Добавлено @ 21:51 Конкретней: процедура ReadCallback. -------------------- |
|||
|
||||
| Plamenk |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 258 Регистрация: 18.2.2003 Репутация: 1 Всего: 3 |
Попробуй сделать отдельный поток для функционала выполняемого в ReadCallback.
Например: 1. Твой ReadCallback просто добавляет StateObject в очередь и уведомляет поток обработчик, что пришло но вое сообщение; 2. Поток обработчик последовательно выбирает StateObject из очереди и выполняет обработку; И ещё мне кажется что данный фрагмент кода может является источником проблем:
Ты начинаешь снова получать данные (handler.BeginReceive) не дождавшись окончание отправки (Send). Лучше либо снова получать данные после завершения операции Send (SendCallback), либо использовать для отправки новый Socket. |
|||
|
||||
| iddqd |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 16.11.2005 Репутация: нет Всего: 2 |
Сейчас вся эта красота выглядит вот так, но ошибка осталась. Очередь раньше вобще не имела смысла.
Он им и является Никак не могу вылечить это. Что уже только не делал. Последняя попытка была сделать глобальный флаг и после обработки калбэка на Send менять его.
Даже не представляю как это реализовать -------------------- |
||||||
|
|||||||
| Plamenk |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 258 Регистрация: 18.2.2003 Репутация: 1 Всего: 3 |
Самое простое - попробуй для отправки (Send) использовать новый Socket.
Если в самых общих чертатах, то: 1. Создаешь глобальную очередь; 2. Создаешь поток, который в цикле опрашивает очередь и если там есть сообщения обрабатывает их; 3. Модифицируешь ReadCallback, таким образом, чтобы она заполняла глобальную очередь и уведомляла поток о том, что в очереди появилось сообщение; ЗЫ Доступ к очереди необходимо синхронизовать (самое простое с помощью критических секций). Это сообщение отредактировал(а) Plamenk - 2.3.2007, 17:23 |
|||
|
||||
| iddqd |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 16.11.2005 Репутация: нет Всего: 2 |
Не хватает моих сил и знаний для этой реализации. Может кто-нибудь поможет парой-тройкой строчек кода?
-------------------- |
|||
|
||||
| iddqd |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 16.11.2005 Репутация: нет Всего: 2 |
Вроде всё сделал. Осталась последняя проблема. Вот с этим (цитата) можно пояснить? -------------------- |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Распределённые приложения и сеть | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |