2010-02-14 2 views
1

Я хотел бы фильтровать входящие пакеты из потока за определенное время.Фильтр с FIFO

например.

фильтр все «А» в течение 5 секунд

10:00:00 "A" <- show 
10:00:01 "A" <- don't show 
10:00:02 "B" <- show 
10:00:03 "A" <- don't show 
10:00:06 "A" <- show 

Я думал о реализации этого со своего рода FIFO.

Как вы думаете, что может быть лучшим решением?

Я использую C#, .net 3.5

ответ

0

Я не уверен, что я понял вашу проблему правильно, но не могли бы вы просто хранить время для первого А что вы сталкиваетесь и для каждого входящий A после этого вы сравниваете время с этим временем? Если прошло менее 5 секунд, не показывайте его, если больше времени сбросить время и показать A?

3

Я не вижу преимущества FIFO. Возьмите словарь, в котором строка («A» и т. Д.) Являются ключами и сохраняют время игнорирования (например, DateTime.Now.AddSeconds(5) или использование тиков, если вы боитесь проблем из-за изменений в компьютерном времени). Всякий раз, когда вы получаете новый элемент, проверьте, есть ли у вас его в словаре. Если да, сравните время истечения; игнорируйте элемент, если он еще не был достигнут. Во всех остальных случаях сохраните элемент и просто сохраните новое истечение в словаре.

+0

D'oh, вы избили меня до него. :-) –

+0

Извините, что ... Я подожду еще несколько секунд в следующий раз! ;) – Lucero

+1

хорошая идея, но давайте представим, что мое приложение работает в течение 2 недель и каждые 2 секунды я получаю новый предмет. в какой момент я могу очистить диктофон? – Kai

1

Итак, вы хотите увидеть первый пакет «A» или «B», но повторений до тех пор, пока не пройдет определенное количество времени?

Вы можете создать хеш-таблицу, которая отображает тип (например, «A») на значение DateTime или timer-tick.

Для каждого полученного пакета найдите его тип в хеш-таблице.

Если не найдено, добавьте его вместе со временем (скажем) через пять секунд. Затем выведите пакет.

Если вы нашли его в хеш-таблице, проверьте, прошло ли уже определенное время.

Если это так, вычислите новое время (через пять секунд), заменив старое время и выпустите пакет.

Если нет, проигнорируйте (отфильтруйте) пакет.

+0

ничего себе, ладно. вы можете мне показать, что в нескольких строках «псевдо» кода? – Kai