Как я могу запустить Boost Thread с функцией класса? - PullRequest
1 голос
/ 10 февраля 2012

я делаю класс C ++, где внутри я хочу создать поток для выполнения функции класса, как я могу это сделать? Я покажу вам код.

Функция-член, которую я хочу запустить в потоке:

void SocketServer::runServer(){
    bool connected;
    tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), puerto));
    std::string data;

    while(seguirFuncionando()){
        miSocket = new tcp::socket(io_service);
        std::cout << "Waiting for connection...\n";
        a.accept(*miSocket);
        std::cout << "Connected\n";
        connected = true;
        try{
            while (connected){
                data = readStr();
                if (data.compare("")==0){
                    std::cout << "End of connection.\n";
                }
                else{
                    std::cout << data << "\n";
                }
            }
        }
        catch (std::exception& e){
        std::cerr << "Exception in thread: " << e.what() << "\n";
        }
    }
}

Что я пытаюсь сделать:

void SocketServer::runThreadServer(){
    asio::thread t(runServer);
}

Но он не компилируется. Ошибка:

нет подходящей функции для вызова 'asio :: thread :: thread () примечание: кандидаты: asio :: thread :: thread (Function) [with Function = void (SocketServer :: *) ()]

Как мне это сделать?

Thanx.

1 Ответ

4 голосов
/ 10 февраля 2012

Как сказал Йоахим Пилеборг, стандартный способ сделать это - использовать boost::bind.boost::bind специально создает конструкцию с именем boost::function (которая может передаваться в c'tor boost::thread) из объекта C ++ и его функции-члена.

Примерно так:

boost::thread t(boost::bind(&SocketServer::runServer, this));
...