2013-05-31 2 views
0

У меня есть одна проблема с моим сервером (на основе ASIO & подталкивания :: Thread)подталкивания :: Thread - поток создают проблемы

В строке:

this->connection->thread = boost::shared_ptr<boost::thread>(new boost::thread(worker, this->connection)); 

я получил ошибку:

Core/CCore.cpp: In member function 'void CCore::handle_accept(const boost::system::error_code&)':

Core/CCore.cpp:71:163: error: no matching function for call to 'bind(, CCore* const, boost::arg<1> (&)())'

Полный код ошибки: http://pastebin.com/PaftWzbx

определение CCore & акцептор:

class CCore 
{ 
public: 
     CCore(boost::asio::io_service *io_service, const boost::asio::ip::tcp::endpoint &endpoint); 
     bool failed; 
private: 
     void handle_accept(const boost::system::error_code& error); 
     boost::asio::io_service *io_service; 
     boost::asio::ip::tcp::endpoint endpoint; 
     boost::asio::ip::tcp::acceptor *acceptor; 
     boost::shared_ptr<CConnection> connection; 
}; 

void CCore::handle_accept(const boost::system::error_code& error) 
{ 
    if (error) { 
     // accept failed 
     //LOG(ERROR, "Acceptor failed: " << error.message()); 
     return; 
    } 

    //LOG(INFO, "Accepted connection from " << this->connection->endpoint.address().to_string() << ":" << this->connection->endpoint.port()); 

    this->connection->thread = boost::shared_ptr<boost::thread>(new boost::thread(worker, this->connection)); 

    this->connection = boost::shared_ptr<CConnection>(new CConnection()); 
    this->connection->master_io_service = this->io_service; 
    this->acceptor->async_accept(*(this->connection->socket), this->connection->endpoint, boost::bind(CCore::handle_accept, this, boost::asio::placeholders::error)); 
} 
class CConnection { 
    public: 
    CConnection(void); 
    boost::asio::io_service io_service; 
    boost::shared_ptr<boost::asio::ip::tcp::socket> socket; 
    boost::asio::ip::tcp::endpoint endpoint; 
    boost::shared_ptr<boost::thread> thread; 
    boost::asio::io_service *master_io_service; 
    bool close; 
}; 
void worker(boost::shared_ptr<CConnection> connection) 
{ 
    boost::asio::ip::tcp::socket &socket = *(connection->socket); 
    boost::asio::socket_base::non_blocking_io make_non_blocking(true); 
    socket.io_control(make_non_blocking); 

    char acBuffer[1024]; 
    std::string line(""); 

    while (connection->close == false) { 

    } // while connection not to be closed 
} 

Кто-нибудь знает, как исправить эту ошибку? Спасибо.

+0

поста a [sscce] (http://sscce.org). Я хотел бы, по крайней мере, увидеть определение 'class CCore' и реализацию' CCore :: handle_accept() '. –

+0

Опубликованные определения CCore & accpetor. –

+0

теперь ваш вопрос имеет меньшее значение, вы удалили определение класса CConnection. Пожалуйста, создайте [sscce] (http://sscce.org), чтобы мы могли понять вашу проблему. Я [попытался сделать это] (http://coliru.stacked-crooked.com/view?id=635bc33dd68507435a205a6b6338f85a-c056299b5afab84f40636e0111d56983), используя ваши фрагменты кода, он компилируется просто отлично. –

ответ

1

Поскольку handle_accept является функцией членом CCore, вам необходимо изменить подталкивание :: связать первый параметр из этого:

boost::bind(CCore::handle_accept, ... 

к этому:

boost::bind(&CCore::handle_accept, ... 

Надеется, что это помогает

+0

Здравствуйте, спасибо, что ответит, теперь все работает ^^. –

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