Rx таймаут
От: _NN_ www.nemerleweb.com
Дата: 24.08.15 06:12
Оценка:
Подскажите как сделать такое с Rx .

Грубо говоря нужен аналог диаграммы Ганта.
Имеем источник, который генерирует события.
Каждое событие имеет свойство имя.

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

Диаграмма:

Name |
---------------------------------------------
  A  | x x x (T)
  B  |         y y y (T)
  C  |                   z z z (T)

(T) — это таймаут на определённое время.

Тут имеем событие с A три раза, а потом ждём либо ничего не получим от A и по прерыванию на таймаут выдаем время 3x + T.
Либо получаем событие с именем B и тогда выдаем время 3x + T — первый y.
Далее считаем время B , которое не прерывается ничем кроме таймаута поэтому выдаем интервал 3y + T.
И т.д.

Пытаюсь сообразить с использованием Timeout, TimeInterval , но как-то не выходит.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Rx таймаут
От: Sinix  
Дата: 24.08.15 06:24
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Мне нужно вычислить сколько раз я его получал с тем же именем, либо по прошествию таймаута если не было никаких событий.

ПО описанию до конца задачу не понял, но очень похоже на стандартный Buffer(). Стандартный — в смысле, что его почти везде используют.

Если ещё не прочитана, очень рекомендую intro to Rx. Вот глава про time-shifted.
Re[2]: Rx таймаут
От: _NN_ www.nemerleweb.com
Дата: 24.08.15 07:22
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, _NN_, Вы писали:


_NN>>Мне нужно вычислить сколько раз я его получал с тем же именем, либо по прошествию таймаута если не было никаких событий.

S>ПО описанию до конца задачу не понял, но очень похоже на стандартный Buffer(). Стандартный — в смысле, что его почти везде используют.
Мне нужно интервалы по имени считать.
Т.е. для A будет интервал такой, для B такой и т.д.
Прерывание подсчёта будет либо по прибытию события с другим именем либо завершается по пришествию определённого времени.

В подсчёте нет наложений.

S>Если ещё не прочитана, очень рекомендую intro to Rx. Вот глава про time-shifted.

Мне еще нравится сайт http://reactivex.io/intro.html
Тут картинки ,которые подвигать можно, есть
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Rx таймаут
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.08.15 19:38
Оценка: +1
Здравствуйте, _NN_, Вы писали:

_NN>Пытаюсь сообразить с использованием Timeout, TimeInterval , но как-то не выходит.


Непонятно условие. AABABAACBBBCCC — что должно быть на выходе, скажем, если все идут с интервалом в секунду ?

Навроде как парсер выходит.
Re[3]: Rx таймаут
От: TK Лес кывт.рф
Дата: 25.08.15 07:05
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>>>Мне нужно вычислить сколько раз я его получал с тем же именем, либо по прошествию таймаута если не было никаких событий.

S>>ПО описанию до конца задачу не понял, но очень похоже на стандартный Buffer(). Стандартный — в смысле, что его почти везде используют.
_NN>Мне нужно интервалы по имени считать.
_NN>Т.е. для A будет интервал такой, для B такой и т.д.
_NN>Прерывание подсчёта будет либо по прибытию события с другим именем либо завершается по пришествию определённого времени.

_NN>В подсчёте нет наложений.


Используйте Observable.Window — она разобьет вам исходный поток на неперекрывающиеся потоки А, В и т.д. После этого, надо будет посчитать продолжительность выделенных интервалов:

var items = new Subject<T>();
var data = source.Do(items);
var results = data.Window(() => items.GenerateWindows(timeOut)).SelectMany(window => window.GetInterval());
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.