C++ 非阻塞键盘读取-C/C++;

C++ 非阻塞键盘读取-C/C++;,c++,c,nonblocking,keyboard-events,C++,C,Nonblocking,Keyboard Events,我现在在工作中得到了以下函数。但我需要改进的是,即使没有按下键盘,它也可以从键盘(在终端上)读取输入。我需要知道它何时未按下(空闲),以便开关盒块将落入默认部分。此时,read()函数将等待用户输入。有人能仅仅基于修改以下代码给出建议吗? 注意:我是一名Java程序员,仍在学习C/C++语言,所以可能很难在脑子里想一想。谢谢各位 编辑:我找到了这个链接,似乎与我在fcntl(STDIN_FILENO,F_SETFL,flags | O_NONBLOCK)行中寻找的内容有关。但由于我对C语言几乎一

我现在在工作中得到了以下函数。但我需要改进的是,即使没有按下键盘,它也可以从键盘(在终端上)读取输入。我需要知道它何时未按下(空闲),以便
开关盒
块将落入
默认
部分。此时,
read()
函数将等待用户输入。有人能仅仅基于修改以下代码给出建议吗? 注意:我是一名Java程序员,仍在学习C/C++语言,所以可能很难在脑子里想一想。谢谢各位

编辑:我找到了这个链接,似乎与我在
fcntl(STDIN_FILENO,F_SETFL,flags | O_NONBLOCK)行中寻找的内容有关。但由于我对C语言几乎一无所知,我完全不知道它在说什么。

int kfd=0;
熟食、生食、生食;
字符c;
bool dirty=false;
//以原始模式获取控制台
tcgetattr(kfd和熟食);
memcpy(生的和熟的,sizeof(struct termios));
原始c|lflag&=~(ICANON | ECHO);
//设置新行,然后结束文件
原始c_cc[VEOL]=1;
原始c_cc[VEOF]=2;
tcsetattr(kfd、TCSANOW和raw);
puts(“从键盘读取”);
认沽权证(“===============================”);
puts(“使用箭头键导航”);
while(true){
//从键盘获取下一个事件
如果(读取(kfd和c,1)<0)
{
perror(“read():”);
出口(-1);
}
线性=角度=0;
ROS_调试(“值:0x%02X\n”,c);
开关(c)
{
案例关键代码:
ROS_调试(“左”);
角度=-1.0;
肮脏=真实;
打破
案例密钥代码\u R:
ROS_调试(“权利”);
角度=1.0;
肮脏=真实;
打破
箱子钥匙代码_:
ROS_调试(“UP”);
线性系数=1.0;
肮脏=真实;
打破
案例关键代码\u D:
ROS_调试(“关闭”);
线性=-1.0;
肮脏=真实;
打破
违约:
ROS_调试(“发布”);
线性系数=0;
角度=0;
肮脏=真实;
打破
}

OP似乎已经回答了他们的问题:

我想我解决了我的问题。任何人,请验证并让我知道这是正确的方法,还是完整的方法(我是否错过了任何其他添加步骤,例如,重新设置它-如果这有意义的话)

因此,我发现在进入while循环之前添加这3行:

flags = fcntl(0, F_GETFL, 0); /* get current file status flags */
flags |= O_NONBLOCK;          /* turn off blocking flag */
fcntl(0, F_SETFL, flags);         /* set up non-blocking read */

OP似乎已经回答了他们的问题:

我想我解决了我的问题。任何人,请验证并让我知道这是正确的方法,还是完整的方法(我是否错过了任何其他添加步骤,例如,重新设置它-如果这有意义的话)

因此,我发现在进入while循环之前添加这3行:

flags = fcntl(0, F_GETFL, 0); /* get current file status flags */
flags |= O_NONBLOCK;          /* turn off blocking flag */
fcntl(0, F_SETFL, flags);         /* set up non-blocking read */

与直接使用termios不同,我建议使用类似的方法。这是一个演示如何以非阻塞方式获取键的教程。没有办法只修改上述代码,是吗?我只是想从终端读取键盘输入(忘了提到这一点)。当然,我最后的办法是学习
ncurses
,但我已经很难学习C/C++。@JoachimPileborg我用(我认为是什么)相关链接编辑了我的问题。你认为你知道它在说什么吗?@pst我用(我认为是什么)编辑了我的问题一个相关的链接。你认为你知道它在说什么吗?你可以让
STDIN_FILENO
像那样不阻塞,但是记住
read
在没有什么可读的时候会返回一个错误。检查
errno
看看它是真的错误还是会阻塞(
errno==EWOULDBLOCK
)。与其直接使用termios,我建议使用类似的。这是一个演示如何以非阻塞方式获取键的教程。没有办法只修改上面的代码,是吗?我只是想从终端读取键盘输入(忘了提到这一点)。当然,我最后的办法是学习
ncurses
,但我已经很难学习C/C++。@JoachimPileborg我用(我认为是什么)相关链接编辑了我的问题。你认为你知道它在说什么吗?@pst我用(我认为是什么)编辑了我的问题一个相关的链接。你认为你知道它在说什么吗?你可以让
STDIN_FILENO
像那样不阻塞,但是记住
read
在没有什么可读的时候会返回一个错误。检查
errno
看看它是真的错误还是会阻塞(
errno==EWOULDBLOCK
)。