C++ 带有std::thread的GLFW问题;glfwSwapBuffers(车窗)工作不正常
函数1调用函数2,后者调用函数3 目前的问题是,函数1中的两行代码没有按预期运行。因为这些线,我有一个黑色的显示器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
//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() << "),";
}
}