我希望我的函数在一个单独的线程中运行。我使用Boost库并在我的main.cpp
中包含这样的内容:
#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
我希望线程像这样开始:
boost::thread ethread(Engine::function,info);
// info is an object from the class Engine and i need this in the
// function
我的Engine
课程位于func.h
,功能如下:
void Engine::function(Engine info)
{
//STUFF
boost::this_thread::sleep(boost::posix_time::milliseconds(1));
}
BTW:线程的sleep
函数是否正确?
每次我想编译它都会给我这个错误:
error C3867: "Engine::function": function call missing argument list; use '&Engine::function' to create a pointer to member
我尝试在线程中使用&Engine::function
,并出现此错误:
error C2064: term does not evaluate to a function taking 2 arguments
我也尝试过:
boost::thread ethread(Engine::function,info, _1);
然后出现了这个错误:
error C2784: "result_traits<R,F>::type boost::_bi::list0::operator [](const boost::_bi::bind_t<R,F,L> &) const"
有人可以帮我吗?我只想在主线程旁边运行该功能。
答案 0 :(得分:1)
您应该使用bind函数创建具有指向类成员函数的指针的函数对象,或者使您的函数保持静态。
http://ru.cppreference.com/w/cpp/utility/functional/bind
更详细的解释:
boost :: thread构造函数需要指向函数的指针。在正常函数的情况下,语法很简单:&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;
}
但是如果你需要指向类函数的指针,你必须记住这些函数有隐式参数 - this
指针,所以你也必须传递它。您可以通过使用std :: bind或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;
}