【问题标题】:In GLFW app, std::cin behaves oddly在 GLFW 应用程序中,std::cin 行为异常
【发布时间】:2017-05-16 16:25:44
【问题描述】:

我正在滥用 OpenGL 以使其以各种角度呈现对象的单个屏幕截图。我不需要 GUI 是交互式的;我只需要能够从控制台启动它并通过stdin 输入姿态信息。我需要它以这种方式工作,因为它将通过 Python 应用程序中的popen 调用。

不幸的是,当我使用std::cin 完成此操作时,给它\n 字符似乎不会导致它注册输入。相反,我必须按 Ctrl+D 跟随\n,这样我才能继续按预期提供额外的输入。

请注意,如果我在第一个输入(qw)上执行 Ctrl+D,它会按您的预期退出(由于 cin.eof() 出现 true)。

这种行为是可以接受的,除了it appears Python won't allow me to send a Ctrl+D to the OpenGL app without closing the stream entirely(不是我想要的)。我也尝试发送curses.ascii.EOT(传输结束字符,0x04)而不是(per this forum question),但这似乎也不起作用。

以下是相关代码:

  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 opens multiple threads。甚至在我调用 any 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 应用程序的控制台,我得到的反馈是 ^M 而不是换行符,即使我在 Linux 中。

【问题讨论】:

  • 是什么让你认为这是 GLFW 的错?如果您使用常规控制台应用程序尝试此操作,它有效吗?另外,您使用的是什么操作系统?最后,我不认为检查 EOF 通常是处理此表单继续输入的最佳方式。
  • @NicolBolas 为什么这不适用于常规控制台应用程序? &gt;&gt; 运算符在 cin 上的行为由 C++ 标准定义。我不确定如何回应您关于 EOF 的声明,因为我明确尝试将 EOF 用于行尾;我只是尝试使用 EOF 来检查输入的结尾,这是非常标准的用法。
  • @Cameron 如果这是问题所在,那么它在之前 glfwInit() 被调用之前不会正常工作吗?
  • 默认是行缓冲的。
  • 是什么让您认为这是“滥用 OpenGL”并且“人们通常不会这样做”?我一直使用 OpenGL 进行离屏渲染。唯一的区别是我使用 GLUT(可能没关系)并且我创建了一个 FBO 而不是使用(隐藏的)窗口帧缓冲区。尝试使用 FBO,不要拨打 glfwSwapBuffers

标签: python c++ opengl glfw


【解决方案1】:

GLFW issue tracker 的好心人已经为这种行为提供了解释,这似乎并不是由 GLFW 引起的。

不知何故,我的stty 设置被破坏了(我仍然不清楚这是怎么发生的)。解决方法是运行

stty sane

在运行我的应用程序之前。请注意,stty 的当前设置可以使用

进行检查
stty -a

在这种情况下,问题似乎是icrnl 设置已关闭;它通常将键盘的回车转换为换行符。

【讨论】:

    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2014-11-29
    相关资源
    最近更新 更多