所以,我的问题是:
- 我有一个名为 NetworkInterface 的类,它是使用 RakNet 网络库构建的。
- 它包含一个使用 RakNet 用来发送和接收数据的 while 循环的方法。
现在,我将 NetworkInterface 类设为单例,因为我希望它在我编写的游戏中只存在一次。
但是,如果我只是用 while 循环调用该方法,它会停止我的整个 gqme,所以这就是为什么我希望它在不同的线程上运行,这样它就不会干扰游戏机制。 现在,我使用 std::thread 对象在不同线程上启动 NetworkInterface 中的方法,但它抛出 C3867 错误,指出该方法需要是静态的或某种(我已经在谷歌上找到了)但我不知道我不知道如何解决这个问题,因为我在该方法中使用的变量也不能是静态的。
我希望这是清楚的。简而言之,我将如何在程序的单独线程中实现类的非静态方法。或者,还有更好的方法? (如果弹出,我不想使用 Boost 库)
最佳答案
你需要提供一个对象让你调用非静态成员函数,就像你不能调用method()
一样在其自己的。要提供该对象,请将其传递给 std::thread
在放置函数的参数之后的构造函数。
struct Test {
void func(int x) {}
};
int main() {
Test x;
std::thread t(&Test::func, &x, 42);
t.join();
}
注意我已经通过了 &x
.这是因为非静态类函数接受一个指向调用它的对象的指针,这个指针是 this
。指针。其余的,即42
, 是与带有 42
的方法参数声明相对应的参数恰逢int x
在示例中。
关于c++ - 在非静态成员函数上使用 C++ 11 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22657770/