TH3C0D3R
TH3C0D3R

Reputation: 19

C++ Threading with Boost Library

I want my function running in a separate thread. I use Boost library and include like this in my main.cpp:

#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

I want the thread start like this:

boost::thread ethread(Engine::function,info);
// info is an object from the class Engine and i need this in the
// function

My Engine class is in the func.h and the function looks like this:

void Engine::function(Engine info)
{
    //STUFF
    boost::this_thread::sleep(boost::posix_time::milliseconds(1));
}

BTW: Is the sleep function for the thread right?

Every time I want to compile it gives me this error:

error C3867: "Engine::function": function call missing argument list; use '&Engine::function' to create a pointer to member

I tried to use &Engine::function in the thread and this error appears:

error C2064: term does not evaluate to a function taking 2 arguments

I also tried:

boost::thread ethread(Engine::function,info, _1);

Then this error appeared:

error C2784: "result_traits<R,F>::type boost::_bi::list0::operator [](const boost::_bi::bind_t<R,F,L> &) const"

Can someone help me with this? I only want to run the function beside the main thread.

Upvotes: 1

Views: 12304

Answers (1)

Jeka
Jeka

Reputation: 1384

You should use bind function to create functional object with pointer to class member function or make your function static.

http://ru.cppreference.com/w/cpp/utility/functional/bind

More detailed explanation: boost::thread constructor needs pointer to a function. In case of normal functions syntax is simple: &hello

#include <boost/thread/thread.hpp>
#include <iostream>
void hello()
{
    std::cout << "Hello world, I'm a thread!" << std::endl;
}

int main(int argc, char* argv[])
{
    boost::thread thrd(&hello);
    thrd.join();
    return 0;
}

But if you need pointer to a function of class you have to remember that such functions have implicit parameter - this pointer, so you have to pass it also. You can do this by creating callable object with std::bind, or boost bind.

#include <iostream>
#include <boost/thread.hpp>

class Foo{
public:
    void print( int a )
    {
        std::cout << a << std::endl;
    }
};

int main(int argc, char *argv[])
{
    Foo foo;
    boost::thread t( std::bind( &Foo::print, &foo, 5 ) );
    t.join();


    return 0;
}

Upvotes: 3

Related Questions