我正在尝试在一个线程中运行一个成员函数,但是我在绑定成员函数上得到错误非法操作,我不确定我做错了什么。我想如果有人能解释我做错了什么以及为什么我得到这个错误,并给我一个如何解决它的例子。代码如下所示:
void GameWorld::SetupWorld()
{
// create the window (remember: it's safer to create it in the main thread due to OS limitations)
RenderWindow window(VideoMode(800, 600), "OpenGL");
// deactivate its OpenGL context
window.setActive(false);
// launch the rendering thread
Thread thread(&Render, &window);//This line gives the error
thread.launch();
}
void GameWorld::Render(RenderWindow* window)
{
Texture texture;
Sprite sprite;
if (!texture.loadFromFile("sprite.png"))
{
}
sprite.setTexture(texture);
// the rendering loop
while (window->isOpen())
{
// clear the window with black color
window->clear(Color::White);
// draw everything here...
window->draw(sprite);
// end the current frame
window->display();
}
}
答案 0 :(得分:1)
您有一个严重的undefined behavior案例,无法将指向局部变量的指针传递给该线程。
一旦函数返回,该变量将超出范围,对象将被破坏,留下指向未分配内存的指针。
如果Render
函数不是static
,也会出现问题,因为非静态成员函数有一个隐藏的第一个参数,它成为成员函数内的this
指针。这可能是编译器抱怨的问题。
可能的第三个问题可能是,SetupWorld
函数返回后,您的thread
变量也将超出范围并被破坏。根据您使用的线程框架,它可能会意外地终止线程。
答案 1 :(得分:0)
要解决编译错误,请将投诉行更改为Thread thread(&GameWorld::Render, &window)
但是,为了完整起见,您应该阅读@Some Programme dude的答案。