2010-09-28 31 views
1

請問所有那些CORBA專家在那裏請幫助我解決這個問題。C++ CORBA DII問題

我有一個多線程的應用程序,有一些代碼發送消息到服務器,並等待迴應。我可以看到服務器正在發送迴應,但應用程序似乎並未收到它。

繼承人我的代碼的一部分。

// 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上工作。

回答

1

通過將對象引用從_ptr更改爲_var來進行修復。我寫了一個小測試應用程序來驗證這一點。在改變指針類型後,其行爲如同預期的那樣服務於響應。所以問題在於獲得對接口的初始引用。

0

我對此不太確定,但在我看來,如果第一次輪詢響應失敗,您將退出此函數。然後,當你回來時,你會發送另一個消息(與send_deferred()通話),獨立於第一個。

這意味着,除非您很幸運並在致電poll_response()之前出現回覆,否則您將始終收到投票消息。

+0

對不起,沒有澄清它,但我只是給代碼添加了一條評論。這個特定的輪詢在while循環中的一個單獨的函數中。所以它總是循環檢查響應。正如我在上面提到的,您將在TAO上看到「輪詢...」輸出,而在omniORB上它將立即返回。 – nixgadgets 2010-09-28 05:43:26

+0

沒有probs,@kuzyt,我會把它做成CW,因爲它沒有那麼有用,但我會把它留在這裏作爲記錄。 – paxdiablo 2010-09-28 05:54:15