2013-05-21 5 views
0

Давайте посмотрим, как просто вопрос, который я могу задать. У меня есть:Способ вызова вызова из-за пределов класса

void TCPClient::test(const boost::system::error_code& ErrorCode) 
{ 
    // Anything can be here 
} 

, и я хотел бы назвать это из другого класса. У меня есть глобальный импульс :: thread_group, что создает поток

clientThreadGroup->create_thread(boost::bind(&TCPClient::test,client, /* this is where I need help */)); 

, но не уверен в том, как назвать тест, если это даже правильный путь.

Как пояснение для общего проекта, я создаю tcp-соединение между клиентом и сервером и получаю метод «отправить» (в другом классе), который будет вызываться, когда необходимо отправить данные. Моя текущая цель - иметь возможность вызывать тест (в котором в настоящее время имеется async_send) и отправлять информацию через сокет, который уже настроен при вызове. Тем не менее, я открыт для других идей о том, как реализовать и, вероятно, будет работать над созданием модели потребителя/производителя, если это окажется слишком сложным.

Я могу использовать либо для этого проекта, но позже мне придется реализовать прослушивание, чтобы иметь возможность получать управляющие пакеты с сервера позже, поэтому, если есть какие-либо рекомендации по использованию метода, я был бы очень признателен.

+0

'client' ожидает 1 аргумент типа' error_code', поэтому вы должны передать его 'bind':' bind (& TCPClient :: test, client, some_error) '. –

+1

[This] (http://blog.think-async.com/2010/04/bind-illustrated.html) - иллюстрированный пример, который может помочь с пониманием 'bind'. –

+0

@IgorR. Это коды ошибок, с которыми у меня возникают проблемы. Если у них есть руководство и как использовать их в этой ситуации, я был бы очень признателен, поскольку я не смог ничего найти (возможно, потому, что я не знаю конкретно, что я ищу). – penguin

ответ

0
boost::system::error_code err; 
clientThreadGroup->create_thread(boost::bind(&TCPClient::test,client, err)); 

Это работает для меня. Я не знаю, будет ли на самом деле ошибка, если что-то пойдет не так, поэтому, если кто-то хочет исправить меня там, я был бы признателен (если бы только ради удовольствия).

+0

Как функция 'test' обрабатывает свой аргумент' error_code'? Если вы передаете построенный по умолчанию 'error_code', это означает« no error »(« err == false »). –

+0

Для этого я исхожу из предположения, что при вызове из чего-то другого (например, «m_Socket.async_receive» (boost :: asio :: buffer (m_RecieveBuffer, m_BufLen)) boost :: bind (& TCPClient :: OnReceive, : asio :: placeholders :: error)); ') он поместит ошибку в случае возникновения проблемы в разделе «async_receive» кода, так что, когда он достигнет «OnReceive», у него будет код ошибки для использования , Это предположение может быть неправильным, и это может быть просто «заполнителем», но я предполагал, что он был заменен, если была ошибка. – penguin

+0

'placeholders :: error' - это псевдоним для' _1' и обозначает аргумент кулака связующего, т. Е. 'Bind (& func, asio :: placeholders :: error)' создает функтор, который принимает 1 параметр. Этот параметр передается вызывающим абонентом, вызывающим функтор, то есть диспетчером обработчика завершения asio, когда «async_receive» завершается. –

Смежные вопросы