C ++时间限制不起作用

时间:2016-11-02 01:20:51

标签: c++ visual-c++

如果用户在几秒钟内没有输入输入,我有这个程序应该结束并打印一条消息。但是现在虽然我的代码看似合乎逻辑,但时间限制似乎并没有起作用。 (如果用户没有输入任何内容,时间不会消失)为什么会这样?

AudioClip

3 个答案:

答案 0 :(得分:1)

不提供保修,但如果使用_kbhit是解决方案的一部分,那么您可能只想在检测到某些键盘活动时尝试阅读。

int userInput = 0;
int now = time(0);
int later = 0;
int elapsed = 0;

cout << "Enter number" <<endl;

do {
    later = time(0);
    elapsed = later - now;
    if(_kbhit()) { // we **may** have some input
        cin >> userInput;
        // this is useless for timing purposes!!
        // A simple `break` should suffice.
        switch(userInput)
        {
           case 1: 
             elapsed = 0;
           break; 
        }
    }

} while (elapsed < 4); 


if (elapsed == 4)
{
    system("cls");
    cout << "Too Slow!! Now You're on the Menu!";
    return 0;
}

答案 1 :(得分:0)

这是因为operator>>等待输入输入。完全停止。

cin >> userInput;

此时,由于标准输入是交互式终端,程序会暂停,直到输入内容为止。无论是几分钟,几小时还是几天。程序被杀死,或输入内容后跟 Enter 。没有其他结果。

只是因为程序中的某些其他代码设置了某种计时器,或者诸如此类,并没有改变这个基本事实。在收到一行输入之前,没有其他任何东西会被执行。

要实现这种超时,必须使用特定于操作系统的系统调用,直到标准输入可用或计时器到期为止。这超出了C ++标准的范围。

答案 2 :(得分:0)

问题是cin >>阻止并等待。

这里有几个选项,但想到的就是使用不等待的_kbhit()_getch()来推送自己的选项。伪代码:

string inputStr = "";

while (elapsed time < time limit) {
    if (_kbhit()) {
        int ch = _getch();
        if ch is a carriage return then break;
        otherwise append ch to inputStr;
    }
}

int inputNumber = convert inputStr to an int;

根据您的具体要求调整逻辑,但您明白了。

注意:我不确定这是否有效;请随时在评论中确认或撕开。我现在无法测试它。我使用这些函数已经有一段时间了,如果缓冲区中有输入,或者它是否会清除缓冲区,或者某些奇怪的非stdin控制台依赖的东西,我不确定_getch()是否会立即返回, 或者是什么。