2012-11-16 39 views
2

我的班級Reciever ...它收到一些字符串並將其緩存。如何確保在boost :: asio中停止之前,所有async_handler都已完成?

Reciever::Reciever(boost::shared_ptr<TSBuffer<std::string>> buffer, int port) 
    : port(port), buffer(buffer) 
{ 
    using namespace boost::asio; 
    acceptor_ = new ip::tcp::acceptor(iosev, ip::tcp::endpoint(ip::tcp::v4(), port)); 
} 


Reciever::~Reciever() 
{ 
    delete acceptor_; 
} 

void Reciever::run() 
{ 
    using namespace boost::asio; 
    _start(); 
    iosev.run(); 
} 

void Reciever::stop() 
{ 
    Sender s("127.0.0.1", std::string(8, '$'), port); 
} 

void Reciever::_start() 
{ 
    using namespace boost::asio; 
    boost::shared_ptr<ip::tcp::socket> socket(new ip::tcp::socket(iosev)); 
    acceptor_->async_accept(*socket, boost::bind(&Reciever::acceptHanlder, this, socket)); 
} 

void Reciever::acceptHanlder(boost::shared_ptr<boost::asio::ip::tcp::socket> socket) 
{ 
    std::string delim(8, '$'); 
    boost::system::error_code ec; 
    boost::asio::streambuf strmbuf; 

    boost::asio::read_until(*socket, strmbuf, delim, ec); 
    std::istream is(&strmbuf); 
    std::string re((std::istreambuf_iterator<char>(is)),std::istreambuf_iterator<char>()); 
    re.replace(re.end() - delim.size(), re.end(), ""); 
    if (re.size() && re != std::string(8, '$')){ 
     buffer->push(re); 
     _start(); 
} 

在main()函數中,我使用X(不確定)線程將X字符串發送給Reciever。當Reciever :: acceptHanlder被調用X次(這意味着X字符串被處理)時,我想停止接收者(調用Reciever :: stop)。 但我不知道如何確定?

+1

爲什麼你不能統計'acceptHandler'調用? –

回答

2

我看到有沒有可能調用async_accept最後一行acceptHanlder。因此,您可以簡單地在收件人對象內部實現一個計數器,只需在工作完成時不要致電_start。同樣的接收器用於不同的線程,它更復雜,我更喜歡使用「對象連接」範例。你

也可以使用ASIO ::鏈限制acceptHanlder -s所以只有一個acceptHanlder給予Reciever可以在任何時間被激活。這消除了Reciever中的併發問題。因此,您可以放心地致電Reciever::stop(使用相同的)。

相關問題