1

そこにいる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;

その結果、サーバーが応答しても Polling と言い続けます。これは基本的な DII 呼び出しであり、私は実際に ACE/TAO 5.7.9 でコードをテストしています。この正確なコードは、omniORB 4.1.4 で完全に機能します。ただし、これを ACE/TAO で動作させたいと思っています。

4

2 に答える 2

1

オブジェクト参照を _ptr から _var に変更することで修正できました。これを確認するために、小さなテスト アプリケーションを作成しました。ポインタ型を変更した後、応答を提供する期待どおりに動作します。したがって、問題はインターフェイスへの最初の参照を取得することでした。

于 2010-09-30T12:26:49.157 に答える
0

これについてはよくわかりませんが、最初のポーリング応答が失敗した場合は、この機能を終了するようです。その後、戻ってきたときに、最初のメッセージとは別に、別のメッセージを (send_deferred()通話と共に) 送信します。

つまり、幸運にも を呼び出す前に応答が表示されない限り、poll_response()常にポーリング メッセージが表示されます。

于 2010-09-28T05:35:36.493 に答える