دفعة:: أسيو معلقة في ديستروكتور خدمة محلل بعد رمي من إو_سرفيس:: تشغيل()

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

سؤال

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

أنا لا ترغب في تعليق على الخروج.هل هناك شيء أفعله خطأ?لو ذلك, ماذا?لم أجد الكثير من النقاش حول هذه الأشياء عبر الإنترنت.أنا باستخدام دفعة 1.41.0 على ويندوز 7/64 بت.

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

المحلول

ثم اتصل بوقف () على خدمة الإدخال / الإخراج الخاصة بي

حاول استخدام هذه الحيلة (منسوخة من وثائق الخدمة) عندما تحتاج إلى التوقف io_service:

boost::asio::io_service io_service;
auto_ptr<boost::asio::io_service::work> work(
    new boost::asio::io_service::work(io_service));
...
work.reset(); // Allow run() to exit. 

السبب بسيط (أيضا من الوثائق):اتصل إلى io_service::stop() سوف يتسبب في تشغيل خدمة إو () دعوة للعودة في أقرب وقت ممكن ، والتخلي عن العمليات التي لم تكتمل ودون السماح معالجات جاهزة ليتم إرسالها.

لذلك ، الدعوة io_service::stop() لا يكفي إذا كنت بحاجة إلى إرسال جميع المعالجات.

نصائح أخرى

إيقاف () فقط يشير إلى توقف io_service.إذا اتبعت إيقاف () استدعاء تشغيل آخر ()، يجب أن يعود وتنظيفه بشكل صحيح.

هناك بعض النقاش حول رمي الاستثناءات من معالجات المعالجات في الوثائق .

أنا أيضا أظن أن المشكلة قد تكون مرتبطة ببعض مشكلة حياة الكائنات، على سبيل المثاليتم تدمير خدمة IO بينما لا يزال هناك شيء آخر يشير إليه.نلقي نظرة فاحصة على الأمثلة وكيف يتم استخدام المؤشرات المشتركة لضمان أن الكائنات لا تزال موجودة.

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