Стандартный способ реализации буферизованного потока, который сбрасывается с постоянным интервалом? - PullRequest
3 голосов
/ 17 февраля 2011

Я моделирую пакеты из источника, который создает пакеты с заданным интервалом в секунду.Я хочу создать потоковый класс, который работает как объект ostream, позволяя использовать operator<< для вывода вещей через него, но с оговоркой, что каждое вставленное значение должно быть освобождено из буфера в дескриптор файла, чтобыс указанным интервалом.

Так, например, у меня может быть сокет с файловым дескриптором sockfd и скажите:

MyBuffer buffer(sockfd, 1000); //Interval of 1000 milliseconds
buffer << 1 << 2 << 3;

, и вывод будет синхронизирован так, что он будетвывод

1
<1 second gap>
2
<1 second gap>
3

в розетку.Я смотрю на Boost.Iostreams прямо сейчас, это будет хорошим решением?Есть ли какая-нибудь волшебная фраза, которую я могу найти в Google, которая описывает эту проблему, о которой я не знаю?

Любая помощь будет признательна.

Спасибо, Брэд

Ответы [ 2 ]

2 голосов
/ 18 февраля 2011

Должны ли 1000 мс быть асинхронными? Если нет, вы можете поместить Sleep (1000) в оператор вашего потока <<. В зависимости от того, что вы пытаетесь сделать, это может подойти вам. </p>

2 голосов
/ 18 февраля 2011

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

Это не использует библиотеку потоков, но я думаю, что это может быть тем, что вы хотите.Внутренне большинство потоков просто объединяют все входные данные, которые они получают, в массу текста, теряя информацию о том, какие части текста соответствуют каждому вставленному объекту.

РЕДАКТИРОВАТЬ : я долженупоминал об этом в первый раз, но, пожалуйста, не забудьте использовать соответствующую синхронизацию в этой очереди!Возможно, вы захотите использовать мьютекс для защиты доступа к нему или использовать умную очередь без блокировки, если это не сработает.Только убедитесь, что не читаете вслепую и не пишите в него из нескольких потоков.

...