Проблема boost :: bind placeholder при привязке Handler к boost :: asio :: strand - PullRequest
1 голос
/ 09 февраля 2012
void Connection::HandleRecvData(const boost::system::error_code & error)
{
    boost::asio::async_read( m_socket, boost::asio::buffer( m_recv_buffer ),
           m_io_strand.wrap( boost::bind( &Connection::HandleRecvData,
                                          shared_from_this(), _1, _2 ) ) ); //works
    boost::asio::async_read( m_socket, boost::asio::buffer( inbound_data_ ),
           m_io_strand.wrap( boost::bind( &Connection::HandleRecv, 
                                          shared_from_this(), _1, _2 ) ) ); //doesn't work
}

Обработчик

void Connection::HandleRecv( const boost::system::error_code & error, int32_t actual_bytes )
{
    if( error || HasError() || m_hive->HasStopped() )
    {
        StartError( error );
    }
    else
    {
        m_recv_buffer.resize( actual_bytes );
        OnRecv( m_recv_buffer );
        m_pending_recvs.pop_front();
        if( !m_pending_recvs.empty() )
        {
            StartRecv( m_pending_recvs.front() );
        }
    }
}

Различные типы буферов:

std::vector< uint8_t > m_recv_buffer;  //and 
std::vector< char > m_recv_buffer;

Я не получаю сообщение об ошибке компилятора, но во время выполнения, когда цепочка событий для получения данных запускается, "& Connection :: HandleRecv" никогда не вызывается. Я предполагаю, что это потому, что сигнатура функции неверна, когда заполнители оцениваются и функция никогда не вызывается.

Может кто-нибудь помочь объяснить, как заполнители оцениваются / подчиняются.

Я проверил документацию по привязке и вижу:

bind(&X::f, ref(x), _1)(i);     // x.f(i)
bind(&X::f, &x, _1)(i);         //(&x)->f(i)
bind(&X::f, x, _1)(i);          // (internal copy of x).f(i)
bind(&X::f, p, _1)(i);          // (internal copy of p)->f(i)

но нет "(i)", когда я звоню.

boost::bind( &Connection::HandleRecvData, shared_from_this(), _1, _2 )

PS Это мой первый пост, любые советы могут быть полезны в том, что касается уровня детализации, который я предоставил, и где я могу более четко описать свою проблему в следующий раз. Заранее спасибо.

...