制限時間内のキー入力検査
Posted feedbacks - VB.net
難しいですね……。なんでダメなんだろ。少し調べてみました。 ReadKeyとKeyAvailableは、それぞれWindows APIのReadConsoleInputとPeekConsoleInputを内部で呼び出しています。 これらの関数の引数にはコンソール入力バッファのハンドルを必要としていて そのハンドルをWindows APIのGetStdHandleで取得し使用しています。 ReadKeyとKeyAvailableではこのハンドルを共有して(Private変数で)いるのに対し ReadLineではメソッドが呼ばれたときGetStdHandleを呼び出し新たにハンドルを取得して それを元にSystem.IO.Streamオブジェクトを作成しています。 ハンドルの値は結果的に同じになるのでしょうが、ここらあたりが原因なのかな? そしてVB.NETのコードも併せて。ReadLineの方で……。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | Sub Main()
InputCheck(5, "ABCDEFG")
InputCheck(4, "HIJKLMN")
InputCheck(3, "OPQRSTUVWXYZ")
End Sub
Sub InputCheck(ByVal n As Integer, ByVal s As String)
Console.Write("input({0}) => ", s)
Do While Not Console.KeyAvailable
Threading.Thread.Sleep(100)
Loop
Dim time As DateTime = Now
Dim input As String = Console.ReadLine
Dim a As Double = Now.Subtract(time).TotalMilliseconds
If Now.Subtract(time).TotalMilliseconds > 1000 * n Then
Console.WriteLine("TIMEOUT")
ElseIf input.Equals(s) Then
Console.WriteLine("OK")
Else
Console.WriteLine("NG")
End If
End Sub
|




raynstard
#3420()
Rating0/2=0.00
関数 InputCheckerは、以下の仕様を満たしてください。
たとえば、「InputCheker(5, "ABCDEF")」と指定した場合、 出力例はこんな感じです。
1. input(ABCDEF) =>と出力して入力待ちをし、ユーザーが「ABCDEF<ENTER>」を入力したとき、 入力開始から5秒以内ならば「OK」、5秒をこえていれば「TIME OUT」を出力します。 このとき、ユーザーがキーを押下しなければ1. を出力してから たとえ10秒たっていても「TIME OUT」にはならないので注意してください。 時間計測はあくまでユーザーが入力を開始してからです。
このお題はraynstardさんの投稿です。ご協力ありがとうございます。
[ reply ]