在图形应用程序中,我使用控制台输入执行调试命令.创建控制台时,还会创建一个新线程来收集处理所有输入的用户命令,图形应用程序继续并行运行.我使用boost :: thread库.
到目前为止它工作得很好,但我还没有找到一个很好的解决方案来停止执行这个线程.线程总是在等待用户输入:
while(appRunning)
{
std::cin>>theUserCommand;
// ...do stuff
}
Run Code Online (Sandbox Code Playgroud)
然后当图形应用程序结束时,它将停止所有控制台功能,其中包括线程:
appRunning = false;
// do some more related clean up
myListeningThread->join();
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,在调用join之后,std :: cin将等待用户输入.我尝试的解决方案之一是创建事件"合成击键",std :: cin将获得你用ENTER发送的任何值,线程将很好地结束,这个解决方案是可怕的,我不想保留它.此外,它确实在工具执行的其中一个环境中工作,但在我尝试将其与UI API一起使用时失败了.你能指导我怎样才能以正确的方式解决这个问题?无法确切地说,如果在C++文档中有一个函数来阻止std :: cin等待用户输入,并且只是继续执行程序,它甚至可能吗?
编辑:很好我发现keybd_event对某些环境有点误导,显式指定WriteConsoleInput工作良好的输入处理程序.
我的系统使用 freeglut 的 OpenGL 和 GLSL 的默认版本是 4.1,同样使用 glew,它的初始化、着色器编译和链接以及执行都没有问题。
当我没有指定 glutInitContextVersion、glutInitContextFlags 或 glutInitContextProfile 时,会发生这个默认版本,然后我的着色器工作正常。
不管我是否支持这个版本,我都想提供一个 3.3 的替代方案。当我使用指定 3.3 版本的 glut 上下文时,应用程序启动时没有错误,glew 不会抱怨。我的着色器假设使用 GLSL 3.3 版本,然后我设置了行
#version 330
Run Code Online (Sandbox Code Playgroud)
但是当我的着色器被编译时,OpenGL 会抱怨一个无效的枚举消息。我尝试删除此行或将其设置为另一个版本,但仍然出现相同的错误。在所有初始化都正确完成后,我要求使用 OpenGL 版本,我得到了正确的 3.3,但对于 GLSL 版本,我仍然得到默认的 4.1。
glGetString(GL_SHADING_LANGUAGE_VERSION);
Run Code Online (Sandbox Code Playgroud)
如果我是对的,请纠正我,我猜这个版本被着色器代码中的版本行覆盖了。我想知道是否也有机会初始化指定 GLSL 版本的上下文?