【问题标题】:Get User Input without Blocking Endless loop在不阻塞无限循环的情况下获取用户输入
【发布时间】:2014-12-09 18:04:21
【问题描述】:

我编写了一个简单的 C 程序,它基本上由一个向上计数的无限循环组成。在循环过程中,会要求用户输入 - 而棘手的部分来了:在等待用户时不应该阻塞循环,而是在他输入时立即显示他的输入:

int main(void){
  int i;
  char dec;

  for(;;i++){
    printf("%d\n", i);
    sleep(5);
    if(i==4 || i==8){
        printf("Please enter Y or N\n");
        dec = fgetc(stdin);
        printf("%c\n", dec);
    }
  }

return 0;
}

我在这里Python 找到了一个与 Python 类似的问题。那么我是否需要使用 pthread 将用户交互推送到新线程中,还是有更简单的选择?

谢谢!

编辑

int main(void){
int i=0;
char dec;

fd_set input_set;

for(;;i++){
    printf("%d\n", i);
    sleep(2);
    if(i==4 || i==8){

        FD_ZERO(&input_set );   /* Empty the FD Set */
        FD_SET(0, &input_set);  /* Listen to the input descriptor */
        dec = select(1, &input_set, NULL, NULL, 0);

    }
}

return 0;
}

【问题讨论】:

  • 你使用什么操作系统?

标签: c loops pthreads block user-input


【解决方案1】:

您想要做的只有使用系统相关库才能实现。例如,在 Unix 上,如果用户按下了按钮,您通常会使用 ncurses 从用户那里获取信息。

它依赖于系统的原因是异步 IO 不适用于所有文件系统流。尤其是用户 I/O 阻塞,并且该阻塞是不可避免的。

如果您致力于拥有一个仍然使用读/写系统调用的多线程程序,您将需要有两个线程,一个用于 I/O,一个用于其他一切。在其他所有线程上,您可以查询一些共享内存区域并查看 I/O 线程是否已将正确类型的数据写入此共享内存区域。

【讨论】:

  • 在 linux 上参见 curs_getch 手册页。这是使您的程序按照您的示例工作方式工作的单行修改。很抱歉没有用上面的答案说得更清楚。
【解决方案2】:

如果您仅使用 linux,请查看此 SO 帖子:What are the differences between poll and select?

如果您同时使用这两个线程和/或您已经拥有 pthread,则使用单独的线程。

【讨论】:

  • +1 感谢您提及选择!我查看了选择并更新了我的问题。你曾经使用过 select 吗?它还在等待输入时阻塞循环...
【解决方案3】:

如果您使用的是 Windows,也许您可​​以尝试使用键盘挂钩。见SetWindowsHookEx。 它将通过回调捕获所有键盘点击。

如果你使用的是Linux,也许你可以使用这个:Non-blocking keyboard read - C/C++

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多