2014-03-26 333 views
2

用C++多线程11所以,我的问题是这样的:非静态成员函数

  • 我有一个叫NetworkInterface类正在使用RakNet网络库建成。
  • 它包含一个使用RakNet用来发送和接收数据的while循环的方法。

现在,我做了NetworkInterface类单身,因为我希望它只是在我的游戏我在写有一次。

但是,如果我只是用while循环调用方法,它会阻止我的整个gqme,所以这就是为什么我希望它在不同的线程上运行,所以它不会干扰游戏机制。 现在,我使用std :: thread对象在另一个线程上的NetworkInterface中启动该方法,但它抛出了C3867错误,该错误声明该方法需要是静态的或某种类型的(我已经在Google上找到了这个),但我不知道不知道如何解决这个问题,因为我在该方法中使用的变量不能是静态的。

我希望这很清楚。简而言之,我将如何在我的程序的单独线程中实现来自类的非静态方法。或者,还有更好的方法? (如果弹出,我不想使用Boost库)

回答

4

您需要为您提供一个对象来调用非静态成员函数,就像您自己不能调用method()一样。要提供该对象,请在将函数放在参数后传递给std::thread的构造函数。

struct Test { 
    void func(int x) {} 
}; 


int main() { 
    Test x; 
    std::thread t(&Test::func, &x, 42); 
    t.join(); 
} 

LIVE EXAMPLE

请注意,我已经通过&x。这是因为非静态类函数接受指向它被调用的对象的指针,并且该指针是指针this。其余部分是42,这个参数对应于方法的参数声明42与示例中的int x一致。

+0

我试过了,但它似乎没有工作。目前我有这个: UpdatePackages x; 的std ::线程T1(UpdatePackages :: FUNC,&x); t1.join(); 但我不能这样做,显然这是在保持UpdatePackages类方法的类的构造函数(对不起我。不能改变注释的格式) – Dries

+0

@Dries你应该传递'this'而不是创建另一个对象,当然你想从'this'调用一个方法,对吗?它会在另一个线程上运行,但它有这个原理和明白地调用一个方法一样''std :: thread t1(&UpdatePackages :: func,this);' –

+0

是的,所以我现在改了它,唯一的错误就是'&UpdatePackages :: func'。说'名字后跟::必须是一个类或命名空间名',我是否需要包含一些东西来使用':: func'? – Dries

相关问题