发出哔哔声直到任何输入

时间:2012-08-02 13:09:40

标签: c++ audio beep

我正在制作测验计划。所以我想要的是每当在用户面前呈现任何问题时,他都有30秒的时间来回答它。在这30秒内,我希望以1秒的间隔发出哔哔声('\ a')。现在我想要的是,一旦用户输入任何输入,该哔声应立即停止。我已经创建了这个小函数来产生30秒的哔声void beep(){ for(int i=0;i<30;i++){cout<<"\a"; Sleep(1000); } } 但是一旦用户输入他/她的答案我就不知道如何阻止它,因为一旦我打电话它就什么也做不到,直到它结束。 任何人都可以为它提供任何解决方法吗?

4 个答案:

答案 0 :(得分:1)

你需要做一个循环,在某个地方保持“开始时间”,每次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();

答案 1 :(得分:1)

我可以建议的粗略事实是

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);
     }

答案 2 :(得分:1)

免责声明:我不是Windows程序员,我不知道这是好风格,还是会编译或工作。我不能在这里测试它。然而,由于没有其他人给出解决方案,这是一个起点。当我了解更多时,我会编辑这个答案,希望有更多了解这个问题的人会出现。

编辑:我将_kbhit()伪造成一个返回false的简单函数,它至少编译并看起来运行正常

编辑:好的我在工作中有视觉工作室,我从不使用它。现在的代码编译和工作(我怀疑时间已关闭)。

编辑:更新它以立即回读被击中的键(而不是等待用户点击输入)。

这是重要的功能:http://msdn.microsoft.com/en-us/library/58w7c94c%28v=vs.80%29.aspx

#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;
}

答案 3 :(得分:-1)

对于Windows: #include <windows.h> ... Beep(1480,200); // for example. ...

Beep()在内核中的单独线程中执行(我知道),所以你可以不关心多线程 - 当它执行时,你的profram可以检查输入,或输入新的问题,例如