在GLFW应用程序中,std::cin的行为很奇怪
In GLFW app, std::cin behaves oddly
我滥用OpenGL让它以各种角度呈现对象的单个屏幕截图。我不需要 GUI 是交互式的;我只需要能够从控制台启动它并通过stdin
输入姿态信息。我需要它以这种方式工作,因为它将通过 Python 应用程序的popen
调用。
不幸的是,当我使用std::cin
来完成此操作时,赋予它n
字符似乎不会导致它注册输入。相反,我必须按照 Ctrl+Dn
,这允许我继续按预期提供其他输入。
请注意,如果我在第一个输入(qw
)上执行 Ctrl+D,它会按您的预期退出(由于cin.eof()
即将出现true
)。
这种行为是可以接受的,除了 Python 似乎不允许我在不完全关闭流的情况下向 OpenGL 应用程序发送 Ctrl+D(不是我想要的)。我也尝试发送一个curses.ascii.EOT
(传输结束字符,0x04)代替(根据这个论坛问题),但这似乎也不起作用。
以下是相关代码:
glfwSwapBuffers(window);
std::cerr << "Waiting for input ? " << std::flush;
// priming read
std::cin >> qw;
/*
* Main event loop
*/
while (!std::cin.eof()) {
//glfwPollEvents(); // Seems to make no difference
std::cin >> qx;
std::cin >> qy;
std::cin >> qz;
object = glm::normalize(glm::dquat(qw, qx, qy, qz));
std::cerr << "Quaternion: " << object.w << ',' << object.x << ',' << object.y << ',' << object.z << std::endl;
scene.render(&shader_program, object, translation, sensor);
pixels = scene.projected_area(width, height);
projected_area = pixels * box_width * box_width / (double)(width * height);
std::cout << std::setprecision(17) << projected_area << std::endl;
glfwSwapBuffers(window);
// next priming read
std::cin >> qw;
}
glfwTerminate();
似乎这个特殊的用例超出了人们通常使用OpenGL所做的事情。谁能解释一下发生了什么/告诉我如何让它表现得像我不使用 GLFW 一样?
更新:我想知道这是否会发生,因为 glfw 打开了多个线程。甚至在我调用任何glfw 方法之前,我就看到了我的进程的五个线程:
$ ls -l /proc/16051/task
total 0
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16051
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16052
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16053
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16054
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16055
更新 2:我已经验证了当我打开文件并从ifstream
而不是从标准输入读取时会发生正常行为。我还注意到,当我在OpenGL应用程序的控制台中按回车键时,即使我在Linux上,我得到的反馈也是^M
而不是换行。
GLFW问题跟踪器的好心人已经为这种行为提供了解释,这似乎不是由GLFW引起的。
不知何故,我的stty
设置变得无聊(我仍然不清楚这是怎么发生的)。分辨率是运行
stty sane
在运行我的应用程序之前。请注意,可以使用以下命令检查stty
的当前设置
stty -a
在这种情况下,问题似乎是icrnl
设置已关闭;它通常将键盘上的回车符转换为换行符。
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 在GLFW应用程序中,std::cin的行为很奇怪
- 为什么我的应用程序即使我的应用程序也关闭,即使我有cin.get();
- 如何将可编辑的预定义字符串写入 C++ 控制台应用程序中的 cin 输入运算符
- CIN / Getline在控制台应用程序中的一行中
- 使用c++,在制作控制台应用程序时,是否有一种方法可以让cin接受输入的下一个字符并在不按回车键的情况下继续