如何在课堂上使用线程

How do I use threading in a class?

本文关键字:线程 课堂      更新时间:2023-10-16

我正在尝试为我的OpenGL项目创建一个加载屏幕,并且已经阅读了这篇文章,为了使其正确工作,最好使用线程。我试图用我的线程调用我的函数,但我一直收到这些错误:

错误C2064:术语的计算结果不是采用3个参数的函数

IntelliSense:没有构造函数"std::thread::thread"的实例与参数列表匹配参数类型为:(void(Screen*newScreen,bool activeVisuals,bool active Controls),PlayScreen*,bool,bool)

这是我的代码:

//LoadingScreen
class LoadingScreen
{
    LoadingScreen();
    void LoadNewScreen(Screen* newScreen, bool activeVisuals, bool activeControls);
    void Setup();
};
void LoadingScreen::LoadNewScreen(Screen* newScreen, bool activeVisuals, bool activeControls)
{
}
void LoadingScreen::Setup()
{
    PlayScreen *playScreen = new PlayScreen();
    std::thread first(LoadingScreen::LoadNewScreen,playScreen, true, true);// , playScreen, true, true);
    first.join();
}
//source.cpp
LoadingScreen loadingScreen;
int main()
{
    LoadingScreen loadingScreen = LoadingScreen();
    loadingScreen.Setup();
    return 0;
}

您需要传递一个附加参数,该参数是作为第一个参数传递其成员函数的类的实例。

std::thread first(&LoadingScreen::LoadNewScreen, this, playScreen, true, true);
                                             //  ^^^^ <= instance of LoadingScreen

需要额外的参数,因为这实际上就是所谓的LoadNewScreen

this->LoadNewScreen(playScreen, true, true);

您需要给std::thread(Function &&f, Args&&... args)一个Lambda或一个函数指针。

更改

std::thread first(LoadingScreen::LoadNewScreen,playScreen, true, true);

std::thread first(&LoadingScreen::LoadNewScreen,playScreen, true, true);

如果您需要对this指针的引用,也可以使用Lambda。