Вверх ↑
Этот топик читают: Гость
Ответов: 5446
Рейтинг: 323
#1: 2012-05-24 21:50:02 ЛС | профиль | цитата
В процессе разработки (несколько специализированного) IRC-клиента возникла задача обработки сообщений, поступающих от сервера.
Каждое сообщение - это строка, заканчивающаяся символами
. Сообщения идут в течении всего сеанса
(в основном это PING-сообщения, на которые нужно оперативно отвечать PONG-сообщениями, иначе сервер решит, что ты отключен).

Собственно вопрос: как организовать FIFO-стек для накопления входящих сообщений? Обрабатывать сообщения будет отдельный поток. Пока что получается вот такая жуть:
code_27996.txt

Вопрос: а нельзя ли как-то попроще?
карма: 1

0
файлы: 1code_27996.txt [1.2KB] [328]
Ответов: 3889
Рейтинг: 362
#2: 2012-05-24 22:09:16 ЛС | профиль | цитата
iarspider писал(а):
как организовать FIFO-стек
Сразу вспомнился Galkov.
карма: 1

0
Ответов: 8958
Рейтинг: 824
#3: 2012-05-24 23:11:22 ЛС | профиль | цитата
iarspider, раньше и сейчас code_27997.txt (Ура-а Galkov-у !)
карма: 19

0
файлы: 1code_27997.txt [1.8KB] [204]
Ответов: 5446
Рейтинг: 323
#4: 2012-05-24 23:56:51 ЛС | профиль | цитата
Леонид, это не совсем то. Тут обработка команды происходит по "переполнению" стека, а я не могу предсказать, успею ли я обработать поступившую команду до того, как придёт следующая.
карма: 1

0
Разработчик
Ответов: 26304
Рейтинг: 2146
#5: 2012-05-25 00:23:14 ЛС | профиль | цитата
iarspider, я че-то не пойму, а чем тебя стандартный стек с защитой доступа не устраивает
карма: 22

0
Ответов: 8958
Рейтинг: 824
#6: 2012-05-25 00:37:49 ЛС | профиль | цитата
nesco, надо на списке строк -- переполнения очень долго ждать! code_27998.txt
карма: 19

0
файлы: 1code_27998.txt [1.1KB] [244]
Ответов: 5446
Рейтинг: 323
#7: 2012-05-25 06:51:10 ЛС | профиль | цитата
nesco, стандартный - он LIFO (последним пришёл — первым ушёл), а мне FIFO (первым пришёл — первым ушёл) надо.
карма: 1

0
Разработчик
Ответов: 26304
Рейтинг: 2146
#8: 2012-05-25 09:02:15 ЛС | профиль | цитата
Для строк я вот такое пользую



Add(MultiElementEx,10273865,462,700)
{
@Hint=#5:Queue|
@IsLib=True
AddHint(43,-27,47,13,@Hint)
}
BEGIN_SDK
Add(EditMultiEx,14243851,21,21)
{
WorkCount=#6:doPush|5:doPop|
EventCount=#5:onPop|7:onEmpty|
Width=328
Height=151
VOffset=42
link(doPush,12821464:doAdd,[])
link(doPop,16479268:doData,[(49,76)(49,132)])
}
Add(StrList,12821464,133,63)
{
Point(doGetString)
Point(onGetString)
link(onGetString,16280060:doCase,[])
}
Add(DoData,8252341,77,77)
{
Data=Integer(0)
link(onEventData,12821464:doDelete,[])
}
Add(DoData,16479268,77,126)
{
Data=Integer(0)
link(onEventData,12821464:doGetString,[(121,132)(121,111)])
}
Add(Case,16280060,182,70)
{
Value=String()
link(onNextCase,12759087:doEvent1,[])
link(onTrue,5983824:doEvent1,[(236,83)(236,104)])
}
Add(Hub,12759087,259,70)
{
link(onEvent1,14243851:onPop,[(312,76)(312,69)])
link(onEvent2,8252341:doData,[(290,83)(290,34)(64,34)(64,83)])
}
Add(Hub,5983824,259,98)
{
link(onEvent1,12821464:doClear,[(300,104)(300,43)(121,43)(121,76)])
link(onEvent2,14243851:onEmpty,[(321,111)(321,76)])
}
END_SDK

карма: 22

0
Ответов: 3889
Рейтинг: 362
#9: 2012-05-25 09:16:52 ЛС | профиль | цитата
iarspider писал(а):
я не могу предсказать, успею ли я обработать поступившую команду до того, как придёт следующая
iarspider, кстати, можно подправить SafeMode, как минимум добавить точку-флаг, указывающую на срабатывание блокировки, тогда Вы будете знать, что запись не удалась (сработала блокировка) и, например, временно заныкаете данные в промежуточный буфер (стек) и "осознанно" повторите попытку записи позже, то есть без "зависания" всего потока на Wait. Если точка будет работать и при Wait, то по ней другие потоки смогут узнать о "зависании" собрата на SafeMode.Wait, тоже может быть полезно в многопоточных средах.
карма: 1

0
Ответов: 1821
Рейтинг: 168
#10: 2012-05-25 09:32:03 ЛС | профиль | цитата
FIFO
карма: 5

0
Разработчик
Ответов: 26304
Рейтинг: 2146
#11: 2012-05-25 10:35:53 ЛС | профиль | цитата
sаmakacd, там как раз моя схема на StrList-e и плавает
карма: 22

0
Разработчик
Ответов: 4698
Рейтинг: 426
#12: 2012-05-25 10:52:49 ЛС | профиль | цитата
nesco писал(а):
sаmakacd, там как раз моя схема на StrList-e и плавает

И моя на MT-потоке
карма: 10
0
Разработчик
Ответов: 26304
Рейтинг: 2146
#13: 2012-05-25 12:06:25 ЛС | профиль | цитата
Assasin писал(а):
И моя на MT-потоке

Короче -- бери чо хошь
карма: 22

0
Ответов: 5446
Рейтинг: 323
#14: 2012-05-30 01:08:39 ЛС | профиль | цитата
nesco, взял твою схему, вот что в итоге получилось:
(тут было безобразие)
------------ Дoбавленo в 01.08:
Основная засада в том, что в одном пакете могут быть более одной команды, либо хвост от одной и начало другой (и 0 или более целых команд между ними!)
карма: 1

0
Разработчик
Ответов: 26304
Рейтинг: 2146
#15: 2012-05-30 01:14:44 ЛС | профиль | цитата
iarspider писал(а):
Основная засада в том, что в одном пакете могут быть более одной команды, либо хвост от одной и начало другой (и 0 или более целых команд между ними!)

Ну и какие у тебя у самого предложения Ну, я бы воткнул еще один буфер, в котором бы сращивал остатки со следующими данными, те выравнивал бы до целых команд, и в этом буфере всегда бы оставался только один хвост
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)