クイズプログラムを作っています。ですから、私が欲しいのは、ユーザーの前に質問が提示されたときはいつでも、彼はそれに答えるのに30秒かかるということです。そして、この30秒間に、1秒間隔でビープ音('\ a')が鳴ります。ここで必要なのは、ユーザーが入力を入力するとすぐにこのビープ音が停止することです。ビープ音を30秒間鳴らす小さな関数を作成しましたvoid beep(){ for(int i=0;i<30;i++){cout<<"\a"; Sleep(1000); }
}
が、一度呼び出すと終わるまで何もできないので、ユーザーが答えを入力するとすぐに停止する方法がわかりません。誰かがそれの回避策を与えることができますか?
4 に答える
免責事項:私はWindowsプログラマーではありません。これが優れたスタイルであるかどうか、またはコンパイルまたは動作するかどうかはわかりません。ここではテストできません。しかし、他の誰も解決策を与えていないので、それは出発点です。私はもっと学ぶにつれてこの答えを編集します、そしてうまくいけばこれについてもっと知っている誰かが現れるでしょう。
編集_kbhit()
:私は、を返す些細な関数に偽造しましたfalse
、そしてそれは少なくともコンパイルされ、それがうまくいくように見えます
編集:わかりました、私は仕事でmsビジュアルスタジオを持っています、私はそれを決して使用しません。現在のコードはコンパイルされて機能します(ただし、タイミングがずれていると思われます)。
編集:(ユーザーがEnterキーを押すのを待つのではなく)ヒットしたキーをすぐに読み戻すように更新しました。
これは重要な機能です: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);
}
}
}
Windowsの場合:
#include <windows.h>
...
Beep(1480,200); // for example.
...
Beep()はカーネル内の別のスレッドで実行されるため(私が知っているように)、マルチスレッドについて気にする必要はありません-実行中に、proframは入力をチェックしたり、新しい質問を入力したりできます。