لبرمجة شبكة Boost-Asio ما هي أفضل طريقة لمعالجة الاستجابة؟

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

سؤال

أنا جديد على البرمجة الشبكة وخاصة لعمليات ASYNC. ابدأ جديد أيضا مع Boost-Lib

IM تنفيذ فئة، للوصول إلى خادم IMAP. يمكنني إرسال واستلام الأوامر والاستجابة، بشكل عام

الرد هو قائمة الانتظار في dequeue داخل الفصل. أضع خطوط الاستجابة البسيطة في قائمة الانتظار، لمزيد من المعالجة.

ما هو أفضل طريقة لمعالجة استجابة في قائمة الانتظار؟

  1. موضوع إضافي للتحقق (القائمة على الوقت) قائمة الانتظار، لإدخالات جديدة؟
  2. في كل مرة يتم دفع إدخالات جديدة إلى قائمة الانتظار تجعل بعض رد الاتصال؟
    كيف يمكنني تنفيذ وإدماج هذا رد الاتصال؟

ربما شخص ما لديه مثال قصير لهذا.

شكرا

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

المحلول

في كل مرة يتم دفع إدخالات جديدة إلى قائمة الانتظار تجعل بعض رد الاتصال؟ كيف يمكنني تنفيذ وإدماج هذا رد الاتصال؟

أفترض أنك تعمل مع اتصال مزامن موضوع واحد.

تفعل شيئا من هذا القبيل:

class worker {

    deque<message> messages;
    bool is_writing_;

    push_message(message msg) {
        messages.push_back(msg);
        notify();
    }

    void notify()
    {
        if(!is_writing_) {
            is_writing_=true;
            init();
        }
    } 

    void init()
    {
        if(messages.empty()) { is_writing_=false; return; }
        messamge msg=messages.pop();
        convert_to_vector(v);
        async_write(socket,buffer(v),
            boost::bind(&worker::complete,this,placehoders::error));
    }
    void complete(error_code const &e)
    {
        if(!e) {
            init();
        }
        else { cleanup(); }
    }

};

ملحوظة!!!

هذا هو تطبيق موضوع واحد. إذا كنت تريد إعلام من مؤشر ترابط آخر يجب أن لا تتصل some_worker->push_message(msg), ، يجب عليك استخدام iosrvice:

service.post(boost::bind(&worker::push_message,some_worker,msg));

و push_message سيتم استدعاء من نفس الخيط الذي يدير Ioservice.

نصائح أخرى

طريقة واحدة ممكنة لتنفيذ معالج قائمة الانتظار هي استخدام إشارة إشارة.

على سبيل المثال نوع شرط Pthread (وصف) إذا كنت على منصة متوافقة بوسيكس.

يمكن أن يكون لديك رقم N من "مؤشرات الترابط في قائمة الانتظار" في انتظار الخلفية.

  1. في كل مرة يتم دفع شيء ما في قائمة الانتظار، يرسل إشارة الإشارة الخاصة بك.

    • يتم استلام الإشارة عن طريق النوم "معالجة قائمة الانتظار" التي تبدأ في معالجة قائمة الانتظار لأنها تعرف أن لديهم بيانات.

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

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