C++ 单独输入线程上的OpenGL无效操作错误

C++ 单独输入线程上的OpenGL无效操作错误,c++,opengl,visual-c++,glsl,glfw,C++,Opengl,Visual C++,Glsl,Glfw,我在项目的所有组件上都附加了一个“checkErrors”方法,这样我就可以调用“checkErrors”(“Context Name”),它会告诉我到目前为止发生了哪些错误(如果有)。方法如下:(print是我自己的一个方法,只需将其解释为一个简单的printf) 我正在运行一个单独的线程,该线程从终端/控制台获取输入并更改锁在互斥锁后面的变量,互斥锁分别改变程序。函数/方法如下所示: void Engine::console() { std::string input; wh

我在项目的所有组件上都附加了一个“checkErrors”方法,这样我就可以调用“checkErrors”(“Context Name”),它会告诉我到目前为止发生了哪些错误(如果有)。方法如下:(print是我自己的一个方法,只需将其解释为一个简单的printf)

我正在运行一个单独的线程,该线程从终端/控制台获取输入并更改锁在互斥锁后面的变量,互斥锁分别改变程序。函数/方法如下所示:

void Engine::console() {
    std::string input;
    while (true)
    {
        std::cin >> input;

        settingMutex.lock();

        if (input == "something") doSomething();
        // More possible console command here...
        else print(this, "Unknwon Command");

        checkErrors("Console Command");

        settingMutex.unlock();
    }
}
然后,在启动主渲染循环之前不久,我在单独的线程上启动此函数:

consoleThread = std::thread(&Engine::console, this);
consoleThread.detach();

//Render loop:
while (!window->shouldClose())
{
    settingMutex.lock();

    //Some stuff here...

    // render
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //Objects are drawn here...

    settingMutex.unlock();

    glfwSwapBuffers(window->getGLFWwindow());
    glfwPollEvents();

    checkErrors("Engine Loop");
}
一切都按照我的计划进行。正在正确绘制对象,渲染循环不会输出错误

如果我在Console()函数中注释掉“checkErrors”(“Console命令”),我的输入命令也会做它们应该做的事情

然而,如果我不注释那一行,无论我输入什么字符串,我基本上都会得到无限多的“无效操作”错误,这些错误来自“控制台命令”上下文作为输出

我甚至可以从console()函数中删除除checkErrors调用之外的所有内容,但仍然会收到层出不穷的无效操作错误。同时,渲染循环保持完全无错误

我感觉OpenGL上下文不存在于主线程之外,因此在单独的线程上调用glGetError会导致无效的操作错误,但我无法确认


有人知道这里发生了什么吗?

不同的线程不共享其中一个线程中创建的OpenGL上下文,这意味着,当您将控制台放在新线程上时,对
glGetError()
的调用没有基本上下文,并生成异常。

不同的线程不共享其中一个线程中创建的OpenGL上下文,这意味着,当您将控制台放在新线程上时,对
glGetError()
的调用没有基本上下文,并生成异常。

是有意义的。谢谢你证实我的怀疑:)有道理。谢谢你证实我的怀疑:)
consoleThread = std::thread(&Engine::console, this);
consoleThread.detach();

//Render loop:
while (!window->shouldClose())
{
    settingMutex.lock();

    //Some stuff here...

    // render
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //Objects are drawn here...

    settingMutex.unlock();

    glfwSwapBuffers(window->getGLFWwindow());
    glfwPollEvents();

    checkErrors("Engine Loop");
}