C++ 嘟嘟声直到有任何输入

C++ 嘟嘟声直到有任何输入,c++,audio,beep,C++,Audio,Beep,我正在做一个测验节目。因此,我想要的是,无论何时,当任何问题呈现在用户面前时,他都有30秒的时间来回答。在这30秒内,我希望以1秒的间隔发出嘟嘟声('\a')。现在我想要的是,当用户输入任何输入时,这个哔哔声应该立即停止。我创建了这个小函数来产生30秒的蜂鸣音void beep(){for(int I=0;Ifor windows: #包括 ... 嘟嘟声(1480200);//例如。 … Beep()在内核中的单独线程中执行(我知道),因此您不必关心多线程-在执行时,program可以检查输入

我正在做一个测验节目。因此,我想要的是,无论何时,当任何问题呈现在用户面前时,他都有30秒的时间来回答。在这30秒内,我希望以1秒的间隔发出嘟嘟声('\a')。现在我想要的是,当用户输入任何输入时,这个哔哔声应该立即停止。我创建了这个小函数来产生30秒的蜂鸣音
void beep(){for(int I=0;Ifor windows:
#包括
...
嘟嘟声(1480200);//例如。
…


Beep()在内核中的单独线程中执行(我知道),因此您不必关心多线程-在执行时,program可以检查输入,或键入新问题,例如,您需要执行一个循环来维护“开始时间”在某个地方,每过1秒就会发出嘟嘟声,并不断检查是否有有效输入。如果过了30秒或给出了有效输入,则退出。(或输入错误)

伪:

start=now();
lastbeep=start;
end=start+30secs
noanswer=true
while(now()<end&&noanswer)
{
   sleep(100ms)
   noanswre=checkforanswerwithoutblocking();
   if(now()-lastbeep>1sec)
   {
      beepOnce();lastbeep+=1sec;
   }
}
checkIfAnswerIsCorrect();
doStuff();
start=now();
lastbeep=开始;
结束=开始+30秒
无答案=正确
while(现在是()1秒)
{
beepOnce();lastbeep+=1秒;
}
}
检查答案是否正确();
doStuff();

我可以提出一些粗略的建议

void beep(){ 
 char press='n';
for(int i=0;i<30;i++)
   for(int j=0;j<100;j++) 
    {     if(press=='y')
                 return;
           cout<<"\a";
            sleep(10);
     }
void beep(){
炭压;

对于(int i=0;i免责声明:我不是一名Windows程序员,我不知道这是否是一种好的风格,甚至不知道它是否可以编译或工作。我不能在这里测试它。但是,由于没有其他人给出解决方案,这是一个起点。我将在了解更多信息时编辑此答案,希望了解更多信息的人会出现

Edit:我伪造了
\u kbhit()
一个返回
false
的普通函数,它至少可以编译并且看起来运行正常

编辑:好的,我确实有微软的visual studio在工作,我只是从来没有使用过它。现在的代码可以编译并运行(不过我怀疑时间不合适)

编辑:将其更新为立即读回被点击的键(而不是等待用户点击回车键)

这是重要的功能:

#包括
#包括
#包括
#包括
#包括
int main()
{
时间开始时间、最后一声嘟嘟声、缩短时间;
时间(和开始时间);
lastBeep=curTime=startTime;
字符输入='\0';
while(difftime(curTime,startTime)<30.0)
{
if(_kbhit())//如果有输入,获取它并停止。
{
输入=_getch();
打破
}
时间(&curTime);
如果(difftime(curTime,lastBeep)>1.0)//自上次蜂鸣后超过一秒?
{


std::cout听起来像是一个多线程程序的任务……我认为这不是一个好例子,如果你是C++的初学者,可能会有不使用线程(或者至少不显式使用线程)的特定于平台的方法。你使用的是什么操作系统?你愿意使用任何额外的库吗?(不是暗示任何特定的解决方案,只是有用的信息).我对windows不是很感兴趣,但我相信它有一些非阻塞输入功能可用…我会看看,看看我能想出什么。仍然需要绕过阻塞输入。阻塞输入不是问题,阻塞蜂鸣是问题。cI的非阻塞输入有一个答案真的不知道如何实现这一点和代码对我来说似乎很难。对不起,我是新来的…你能用一种简单的方式解释吗?那是最简单的方式。我必须承认,用c/c++正确地实现非阻塞输入似乎非常困难,所以你必须对此做一些研究。伪代码就这么简单。有了线程,你将运行同步和锁定,然后线程问题。同步调用,因此在发出哔哔声时无法尝试获取输入。使用例如
std::cin
从用户获取输入也会被阻塞,这意味着它不会发出不止一次哔哔声。我没有听到任何哔哔声,可能是我使用了错误的频率吗?@Harsh-它在现代硬件上不起作用,除非你正在运行Windows7.阅读此处的备注:这将如何工作?
press
是一个不会在任何地方更新的局部变量?main.cpp | 8 |错误E2451:函数main()中未定义的符号“time”| main.cpp | 8 |错误E2379:缺少语句;函数main()中未定义的符号“startTime”||main.cpp | 10 |错误E2451:函数main()中未定义的符号'lastBeep'| main.cpp | 10 |错误E2451:函数main()中未定义的符号'curTime'| main.cpp | 13 |错误E2268:调用函数main()中未定义的函数'difftime'|main.cpp | 21 |错误E2268:调用函数main()中未定义的函数“difftime”|这些是我尝试在其上运行时遇到的错误codeblocks@Harsh这看起来像是配置代码块的方式出现了错误(找不到头文件)。恐怕无法帮助您。我支持使用
\u kbhit()
。但是,
difftime()
在Windows上不可用。我建议进行一次简单的
睡眠(100)
并每10次迭代发出一声蜂鸣声。毕竟,这项任务不需要很高的精度,用户在处理输入之前可能不会注意到100毫秒的延迟。
#include <windows.h>
#include <conio.h>
#include <ctime>
#include <iostream>
#include <string>

int main()
{
    time_t startTime, lastBeep, curTime;
    time(&startTime);
    lastBeep = curTime = startTime;
    char input = '\0';

    while ( difftime(curTime,startTime) < 30.0 )
    {
        if ( _kbhit() ) // If there is input, get it and stop.
        {
            input = _getch();
            break;
        }
        time(&curTime);
        if ( difftime(curTime,lastBeep) > 1.0 ) // More than a second since last beep?
        {
            std::cout << "\a" << "second\n" << std::flush;
            lastBeep = curTime; // Set last beep to now.
        }
    }
    if ( input )
    {
        std::cout << "You hit: \"" << input << "\"\n" << std::flush;
    }

    return 0;
}