10

我正在使用 C (gcc) 和 ncurses 来制作一个程序,该程序将监视来自串行端口的数据。该程序有一个很大while的,它读取来自端口的数据,同时在屏幕上打印该信息......

但问题就在这里:

它如何从我的键盘读取输入(因为getch()冻结程序直到它获得输入)并同时读取来自端口的信息?

也许我必须使用另一种方式(不是大的while),所以欢迎提出想法!

4

5 回答 5

8

使用nodelay选项使getch成为非阻塞调用。

nodelay(stdscr,TRUE);

更多信息可以在http://www.gsp.com/cgi-bin/man.cgi?topic=nodelay找到

于 2010-10-15T06:30:45.407 回答
0

根据您的环境,您可能有函数 kbhit(),它只是在键盘缓冲区中达到峰值,如果那里有一个键,则返回非零 - 然后您可以执行 getch()。

(conio.h)

于 2010-10-15T06:31:36.557 回答
0

也许叉()?请记住,子进程在单独的进程中运行,因此变量不能在它们之间直接共享

pid_t pID = fork();
if (pID == 0) { // 孩子
   // 代码只由子进程执行
   // getch() ...
} else if (pID < 0) { // 分叉失败
   // 抛出异常
   // ...
} else { // 父级
   // 代码只由父进程执行
   // ...
}
于 2010-10-15T06:31:39.833 回答
0

尝试select()poll()。他们都做同样的事情,但界面不同。你给它一个文件描述符列表,它会等到这些描述符中的至少一个准备好,然后返回并告诉你哪些可以读取(或写入)而不会阻塞。查看链接以获取示例和更多详细信息。

于 2010-10-15T06:44:35.167 回答
-1

用于 cbreak()禁用行缓冲

nodelay(win, TRUE); 

这将为您提供非阻塞getch()功能。

于 2013-09-12T11:03:00.097 回答