在GLFW应用程序中,std::cin的行为很奇怪

In GLFW app, std::cin behaves oddly

本文关键字:cin 应用程序 std GLFW      更新时间:2023-10-16

我滥用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设置已关闭;它通常将键盘上的回车符转换为换行符。