Звуковой сигнал до любого входа

Я делаю программу викторины. Так что я хочу, чтобы каждый раз, когда какой-либо вопрос задавался пользователю, у него было 30 секунд, чтобы ответить на него. И через эти 30 секунд я хочу звуковой сигнал ('\a') с интервалом в 1 секунду. Теперь я хочу, чтобы этот звуковой сигнал прекратился, как только пользователь введет любой ввод. Я создал эту маленькую функцию, чтобы издавать звуковой сигнал в течение 30 секунд. void beep(){ for(int i=0;i<30;i++){cout<<"\a"; Sleep(1000); } }Но я не знаю, как это остановить, как только пользователь введет свой ответ, потому что, как только я позвоню, ничего не поделаешь, пока все не закончится. Кто-нибудь может дать какое-либо решение для этого?

4 ответа

Решение

Отказ от ответственности: я не программист Windows, я не знаю, является ли это хорошим стилем или даже если он будет компилироваться или работать. Я не могу проверить это здесь. Однако, поскольку никто не дал решения, это отправная точка. Я отредактирую этот ответ, когда узнаю больше, и, надеюсь, найдется тот, кто знает об этом больше.

Изменить: я подделал _kbhit() к тривиальной функции, возвращающейся falseи, по крайней мере, он компилируется и выглядит так, как будто работает нормально

Редактировать: Хорошо, у меня есть MS Visual Studio на работе, я просто никогда не использую его. Код, как он есть сейчас, компилируется и работает (я подозреваю, что время выключено, хотя).

Редактировать: обновил его, чтобы немедленно прочитать обратно нажатую клавишу (вместо того, чтобы ждать, пока пользователь нажмет ввод).

Это важная функция: 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;
}

Вам нужно сделать цикл, который поддерживает "время начала" где-то, подает звуковой сигнал каждый раз, когда проходит 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();

Что -то грубое я могу предложить это

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

Для окон:#include <windows.h> ... Beep(1480,200); // for example. ...

Beep () выполняется в отдельном потоке в ядре (насколько я знаю), поэтому вы можете не заботиться о многопоточности - пока он выполняется, ваш profram может проверить ввод или, например, ввести новый вопрос

Другие вопросы по тегам