Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用c++;11非静态成员函数上的多线程_C++_Multithreading_Networking - Fatal编程技术网

C++ 使用c++;11非静态成员函数上的多线程

C++ 使用c++;11非静态成员函数上的多线程,c++,multithreading,networking,C++,Multithreading,Networking,所以,我的问题是: 我有一个名为NetworkInterface的类,它是使用RakNet网络库构建的 它包含一个使用while循环的方法,RakNet使用while循环发送和接收数据 现在,我将NetworkInterface类设置为单例,因为我希望它在我编写的游戏中只存在一次 但是,如果我用while循环调用该方法,它将停止我的整个gqme,因此thqt就是我希望它在不同线程上运行的原因,这样它就不会干扰游戏机制。 现在,我使用std::thread对象在不同线程的NetworkInte

所以,我的问题是:

  • 我有一个名为NetworkInterface的类,它是使用RakNet网络库构建的
  • 它包含一个使用while循环的方法,RakNet使用while循环发送和接收数据
现在,我将NetworkInterface类设置为单例,因为我希望它在我编写的游戏中只存在一次

但是,如果我用while循环调用该方法,它将停止我的整个gqme,因此thqt就是我希望它在不同线程上运行的原因,这样它就不会干扰游戏机制。 现在,我使用std::thread对象在不同线程的NetworkInterface中启动该方法,但它抛出了C3867错误,该错误指出该方法需要是静态的或某种类型的(我已经在Google上找到了),但我不知道如何修复该问题,因为我在该方法中使用的变量也不能是静态的


我希望这是清楚的。简言之,我将如何从程序的一个单独线程中的类实现一个非静态方法。还是有更好的办法?(如果弹出Boost库,我不想使用它)

您需要提供一个对象来调用非静态成员函数,就像您不能单独调用
方法()。要提供该对象,请在放置函数的参数之后将其传递给
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
重合。

我尝试过,但似乎不起作用。目前我有这样一个:UpdatePackages x;std::threadt1(&UpdatePackages::func,&x);t1.join();但我显然不能这么做。这是在持有UpdatePackages类方法的类的构造函数中(很抱歉,我无法更改注释中的格式)@Dries您应该传递
This
,而不是创建另一个对象,因为您当然想从
This
调用方法,对吗?它将在另一个线程上运行,但其原理与简单地调用方法相同<代码>标准::线程t1(&UpdatePackages::func,this)是的,所以我现在更改了它,唯一的错误是
&UpdatePackages::func
。它说,
名称后跟::必须是类或命名空间名称
。是否需要包含要使用的内容
::func