Проблемы с C ++ CORBA DII - PullRequest
       34

Проблемы с C ++ CORBA DII

1 голос
/ 28 сентября 2010

Не могли бы вы помочь всем этим экспертам 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.

Ответы [ 2 ]

1 голос
/ 30 сентября 2010

Исправлено путем изменения ссылки на объект с _ptr на _var. Я написал небольшое тестовое приложение, чтобы проверить это. После изменения типа указателя он ведет себя так, как и ожидалось, обслуживая ответы. Таким образом, проблема заключалась в получении начальной ссылки на интерфейс.

0 голосов
/ 28 сентября 2010

Я не слишком уверен в этом, но мне кажется, что вы выйдете из этой функции, если первый ответ на опрос не удастся. Затем, когда вы вернетесь, вы отправите еще одно сообщение (с вызовом send_deferred()), независимое от первого.

Это означает, что, если вы не повезете, и перед вызовом poll_response() не появится ответ, вы всегда получите сообщение для опроса.

...