围绕函数调用 std::thread() 的方式不同
Calling std::thread() around a function works differently
这里的代码有什么原因吗:
int main(int argc, char* argv[])
{
Main::Init();
std::thread worker(Main::Mainloop);
worker.join();
Main::Free();
return 0;
}
这里的代码应该以不同的方式工作:
int main(int argc, char* argv[])
{
Main::Init();
Main::Mainloop();
Main::Free();
return 0;
}
注意到 Main
class 被定义为单例,这里是代码:
main.h
#pragma once
#ifndef MAIN_H
#define MAIN_H
#include "window.h"
#include "mainloop.h"
class Main ///Singleton
{
public:
Main(const Main&) = delete;
Main(Main&&) = delete;
Main& operator=(const Main&) = delete;
Main& operator=(Main&&) = delete;
private:
Main();
static Main& Get_Instance();
friend int main(int argc, char* argv[]);
static void Mainloop();
static void Init();
static void Free();
};
#endif // MAIN_H
上面的第一个例子未能初始化 GLFW, GLEW, and ImGui
中的一个,这是我在我的程序中使用的。我试图拆分程序的初始化,但后来我 运行 陷入了这个问题。当我挖得更远时,我达到了这一点,这实际上没有任何意义为什么它不应该工作。基本上它要么抛出异常,要么 ImGui 在运行时向我发送许多错误消息:
failed to compile vertex shader!
failed to compile fragment shader!
failed to link shader program! (with GLSL `#version 460`)
然而 window 打开了,我只能在运行时使用线程示例获得这些。不是另一个。
所有这些库都以某种方式与 OpenGL 交互,因此对它们在哪个线程上执行非常敏感。当前的 OpenGL 上下文是特定于线程的;每个线程都有自己的当前上下文,任何时候一个上下文只能在一个线程内是当前的。
创建 GLFW window 创建 OpenGL 上下文。如果您随后切换到另一个线程,除非您告诉 GLFW 使其在该线程中成为当前上下文,否则该上下文将不会在该线程中处于当前状态。
这里的代码有什么原因吗:
int main(int argc, char* argv[])
{
Main::Init();
std::thread worker(Main::Mainloop);
worker.join();
Main::Free();
return 0;
}
这里的代码应该以不同的方式工作:
int main(int argc, char* argv[])
{
Main::Init();
Main::Mainloop();
Main::Free();
return 0;
}
注意到 Main
class 被定义为单例,这里是代码:
main.h
#pragma once
#ifndef MAIN_H
#define MAIN_H
#include "window.h"
#include "mainloop.h"
class Main ///Singleton
{
public:
Main(const Main&) = delete;
Main(Main&&) = delete;
Main& operator=(const Main&) = delete;
Main& operator=(Main&&) = delete;
private:
Main();
static Main& Get_Instance();
friend int main(int argc, char* argv[]);
static void Mainloop();
static void Init();
static void Free();
};
#endif // MAIN_H
上面的第一个例子未能初始化 GLFW, GLEW, and ImGui
中的一个,这是我在我的程序中使用的。我试图拆分程序的初始化,但后来我 运行 陷入了这个问题。当我挖得更远时,我达到了这一点,这实际上没有任何意义为什么它不应该工作。基本上它要么抛出异常,要么 ImGui 在运行时向我发送许多错误消息:
failed to compile vertex shader!
failed to compile fragment shader!
failed to link shader program! (with GLSL `#version 460`)
然而 window 打开了,我只能在运行时使用线程示例获得这些。不是另一个。
所有这些库都以某种方式与 OpenGL 交互,因此对它们在哪个线程上执行非常敏感。当前的 OpenGL 上下文是特定于线程的;每个线程都有自己的当前上下文,任何时候一个上下文只能在一个线程内是当前的。
创建 GLFW window 创建 OpenGL 上下文。如果您随后切换到另一个线程,除非您告诉 GLFW 使其在该线程中成为当前上下文,否则该上下文将不会在该线程中处于当前状态。