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 回答