C++ 带有std::thread的GLFW问题;glfwSwapBuffers(车窗)工作不正常

C++ 带有std::thread的GLFW问题;glfwSwapBuffers(车窗)工作不正常,c++,multithreading,opengl,concurrency,glfw,C++,Multithreading,Opengl,Concurrency,Glfw,函数1调用函数2,后者调用函数3 目前的问题是,函数1中的两行代码没有按预期运行。因为这些线,我有一个黑色的显示器 //std::thread *thread1 = new std::thread(&Screen::DisplayRows, this, pbr ); //thread1->join(); 但是,这两行DisplayRows(pbr)下面的行似乎工作正常,显示正常。从本质上说,我希望在函数1的for循环中创建一些线程,并希望这些线程通过glfwSwapBuffers

函数1调用函数2,后者调用函数3

目前的问题是,函数1中的两行代码没有按预期运行。因为这些线,我有一个黑色的显示器

//std::thread *thread1 = new std::thread(&Screen::DisplayRows, this, pbr );
//thread1->join();
但是,这两行
DisplayRows(pbr)下面的行似乎工作正常,显示正常。从本质上说,我希望在函数1的for循环中创建一些线程,并希望这些线程通过
glfwSwapBuffers(_窗口)更新显示在功能3中

现在,两行注释的代码确实调用了函数3,但显示没有更新。注释行和显示行(pbr)应该做同样的事情,但是当涉及到注释行时,显示不反映相同的内容

职能1

void Screen::Display(Container* PBC, SimpleSorter *Solution)
{
    while (!glfwWindowShouldClose(window))
    {
        // Scale to window size
        GLint windowWidth, windowHeight;
        glfwGetWindowSize(window, &windowWidth, &windowHeight);
        glViewport(0, 0, windowWidth, windowHeight);

        // Draw stuff
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);   // Set the background color
        glClear(GL_COLOR_BUFFER_BIT);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, WIDTH, HEIGHT, 0, 0, 1);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

    PBC->DrawContainer();// 0, 0);

    std::vector<PixelBlockRow> row = PBC->getRows();

    for ( int i =0; i <PBC->getRows().size(); i ++)
    {
        PixelBlockRow *pbr = &row[i];
        //std::thread *thread1 = new std::thread(&Screen::DisplayRows, this, pbr );
        //thread1->join();
        DisplayRows(pbr);
        }
        getchar();
    }
}
职能3

void SimpleSorter::Sort( PixelBlockRow * p)
{
    auto block = p->GetRow();

    for (int i = 0; i < block.size(); i++)
    {
        for (int j = 0; j < i; j++)
        {
            if (block[i].GetColor().GetR() < block[j].GetColor().GetR())
            {
                Color c = block[i].GetColor();
                block[i].SetColor(block[j].GetColor());
                block[j].SetColor(c);
                p->DrawPixelBlockRow();
                Sleep(5);
                glfwSwapBuffers(_window);
                std::cout << ij++ << std::endl;
            }
        }
    }

    for (int i = 0; i < block.size(); i++) {
        Color c = block[i].GetColor();
        std::cout << "(" << c.GetR() << "," << c.GetG() << "," << c.GetB() << "),";
    }
}
void SimpleSorter::排序(PixelBlockRow*p)
{
自动闭塞=p->GetRow();
对于(int i=0;iDrawPixelBlockRow();
睡眠(5);
glfwSwapBuffers(_窗口);

std::cout OpenGL上下文始终绑定到一个线程。如果要从其他线程调用OpenGL命令,必须将上下文重新绑定到该线程。我尝试在
glfwSwapBuffers(_窗口)行之前添加
glfwMakeContextCurrent(_窗口);
但这没什么区别。我还应该做些什么吗?@BDL:并将其从原始线程中解除绑定。干杯,伙计们,这非常好。非常感谢!OpenGL上下文总是绑定到一个线程。如果你想从其他线程调用OpenGL命令,你必须将上下文重新绑定到该线程。我尝试在行
glfwSwapBuffers(_窗口);
之前添加行
glfwSwapBuffers(_窗口);
,但没有任何区别。还有什么我应该做的吗?@BDL:并将其从原始线程中解除绑定。干杯,伙计们,这非常有效。非常感谢!
void SimpleSorter::Sort( PixelBlockRow * p)
{
    auto block = p->GetRow();

    for (int i = 0; i < block.size(); i++)
    {
        for (int j = 0; j < i; j++)
        {
            if (block[i].GetColor().GetR() < block[j].GetColor().GetR())
            {
                Color c = block[i].GetColor();
                block[i].SetColor(block[j].GetColor());
                block[j].SetColor(c);
                p->DrawPixelBlockRow();
                Sleep(5);
                glfwSwapBuffers(_window);
                std::cout << ij++ << std::endl;
            }
        }
    }

    for (int i = 0; i < block.size(); i++) {
        Color c = block[i].GetColor();
        std::cout << "(" << c.GetR() << "," << c.GetG() << "," << c.GetB() << "),";
    }
}