الطريقة القياسية لتنفيذ دفق مخزّن يتم مسحه على فترات زمنية ثابتة؟

StackOverflow https://stackoverflow.com/questions/5034202

سؤال

أقوم بمحاكاة الحزم من مصدر ينتج حزمًا في فاصل زمني محدد للحزمة/الثانية.أريد إنشاء فئة دفق تعمل مثل 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 والتي تصف هذه المشكلة التي لست على علم بها؟

سيكون موضع تقدير أي مساعدة.

شكرا براد

هل كانت مفيدة؟

المحلول

أحد الخيارات للقيام بذلك والذي يكون متعامدًا تمامًا لبناء فئة تدفقات مخصصة هو الحفاظ على قائمة انتظار من السلاسل التي يتم استقصاؤها بواسطة مؤشر ترابط كل ثانية.في كل مرة يتم فيها استقصاء قائمة الانتظار، يقرأ الخيط العنصر الأول ويرسله عبر الشبكة.

هذا لا يستخدم مكتبة التدفقات، ولكن أعتقد أن هذا قد يكون ما تريده.داخليًا، تقوم معظم التدفقات بجمع كل المدخلات التي تدخلها في كتلة من النص، مما يؤدي إلى فقدان المعلومات حول أجزاء النص التي تتوافق مع كل كائن قمت بإدراجه.

يحرر:كان ينبغي أن أذكر هذا في المرة الأولى، ولكن يرجى التأكد من استخدام المزامنة المناسبة في قائمة الانتظار هذه!قد ترغب على الأرجح في استخدام كائن المزامنة (mutex) لحماية الوصول إليه، أو استخدام قائمة انتظار ذكية خالية من القفل إذا لم ينجح ذلك.فقط تأكد من عدم القراءة والكتابة بشكل أعمى من عدة سلاسل.

نصائح أخرى

هل يجب أن يكون 1000ms غير متزامن؟إذا لم يكن الأمر كذلك، فيمكنك وضع Sleep(1000) في مشغل الدفق الخاص بك <<.اعتمادا على ما تحاول القيام به، يمكن أن يناسبك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top