使用kbhit()和getch()无阻塞接收用户键盘输入

时间:2021-06-28 16:15:17

前言

在我们平时控制台程序的编写过程中,一般情况下都是需要暂停控制台界面,等待用户输入数据之后,程序才会继续运行下去。但是某些情况下,我们希望在循环在用户输入一个按键时才响应特定程序。
常规做法是使用多线程, 如: 子线程中执行任务, 主线程线程中检测用户输入, 然后根据用户输入, 来控制工作线程状态;
如果仅仅是快速做测试, 可以使用C语言中的kbhit()和getch()来实现上述功能.
个人理解: kbhit()内部也是封装了一个线程来检测用户键盘输入.

示例

#include <iostream>
#include <conio.h> // _kbhit(), _getch()
#include <windows.h>

int main()
{
    int counter = 0;
    char exitflag = '\0';
    while (1)
    {
        std::cout << ++counter << ": hello error!\n";

        Sleep(50);

        //函数名:kbhit()
        //功能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
        if (_kbhit())
        {
            // 函数名: getch()
            // 功能及返回值: 从键盘上读取到的字符
            exitflag = _getch();
            if (exitflag == 'q' || exitflag == 'Q')
            {
                std::cout << "用户输入:" << exitflag << ", 退出循环\n";
                break;
            }           
        }
    }

    std::cout << "已经退出了循环\n";

    return 0;
}

// 注:Windows下不推荐使用POSIX。建议使用使用标准C++相似的名称:_kbhit(), _getch()

示例结果

使用kbhit()和getch()无阻塞接收用户键盘输入

参考文章:

关于kbhit函数与延时函数使用
百度百科 - kbhit
kbhit用法