سؤال

هل يمكن لجميع هؤلاء خبراء Corba هناك الرجاء مساعدتي في هذا.

لديّ تطبيق متعدد مؤشرات الترابط مع بعض التعليمات البرمجية التي ترسل رسالة إلى خادم وينتظر استجابة مرة أخرى. أستطيع أن أرى أن الخادم يرسل الاستجابة مرة أخرى ولكن يبدو أن التطبيق لا يتلقى ذلك.

هيريس جزء من الكود الخاص بي.

  // Create a request object for the given message
  msg.request = serverRef->_request("receiveCoreMessageVia");
  msg.request->set_return_type (CORBA::_tc_short);

  msg.request->add_in_arg() <<= msg.sourceGateway;
  msg.request->add_in_arg() <<= msg.octetSeq;

  msg.request->send_deferred();

  ...
  // The following code is in a while loop in a different function. It uses the request reference to check the response.
  // Check if the request has completed
  if (!msg->request->poll_response())
  {
    clssendlog << debug << "Polling..." << endl;

    return false; // No response yet
  }

  // Get the returned result
  clssendlog << debug << "Get response..." << endl;
  msg->request->get_response();

  clssendlog << debug << "Reading the returned response value" << endl;
  CORBA::Short tmp = 0;
  msg->request->return_value () >>= tmp;

والنتيجة هي أنها تستمر في قول الاقتراع حتى لو استجاب الخادم. هذا هو الاحتجاج الأساسي DII وأنا في الواقع أختبر الرمز على ACE/TAO 5.7.9. يعمل هذا الرمز الدقيق تمامًا على Omniorb 4.1.4. ومع ذلك ، أريد حقًا أن يعمل هذا على ACE/TAO.

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

المحلول

تمكنت من الإصلاح عن طريق تغيير مرجع الكائن من _ptr إلى _var. كتبت تطبيق اختبار صغير للتحقق من هذا. بعد تغيير نوع المؤشر الذي يتصرف كما هو متوقع تقديم الردود. لذلك كانت المشكلة هي الحصول على الإشارة الأولية إلى الواجهة.

نصائح أخرى

لست متأكدًا جدًا من هذا ولكن يبدو لي أنك ستفعل خروج هذه الوظيفة إذا فشلت استجابة الاستطلاع الأولى. ثم ، عندما تعود ، سترسل اخر الرسالة (مع send_deferred() استدعاء) ، مستقلة عن الأول.

هذا يعني ذلك ، ما لم تكن محظوظًا ويظهر الرد قبل الاتصال poll_response(), ، ستحصل دائمًا على رسالة اقتراع.

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