掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
キーボードイベントのリアルタイム性を上げるには? (ID:36496)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
寝る前だってのに… 先ず、USBキーボードが押されてからアプリケーションが押されたと識別するまでの流れ 1.キーを押す 2.キーボード内のICが短絡を検知 3.キーコードをUSB経由で送信 4.Windowsがキーボード信号を検知 5.Windowsがフォーカスアプリケーションに向けてWM_KEYDOWNを送信 6.アプリがWM_KEYDOWNを受信 今回問題にしているのは「1−6迄大体何秒の誤差がでるか?」ですよね? スタート、ストップが共にキー入力で行われるわけなので、 1−6迄の経過時間は開始と終了で相殺されますもんね。 ではこれをどうやって調べれば知ることが出来るでしょうか? 結果として相手は0.1msオーダー以下の挙動なので難問です。 その計測を安価な既知の信号を用いて検証しているのが私の上記ソースです。 先ず、既知の一定間隔のキーボードからの信号をWindowsに送ります。 この信号は厳密に一定でなくてはなりません、 ですが、一般家庭にそんなにしっかりした振動体を用意することなんて現実的ではないので、 今回はあえて、キーを押しっぱなしにしたときの信号を一定と仮定して使用してます。 送信信号が一定であれば受信も一定であるのが本来安定したシステムです。 ですが、Windowsと言うOSはマルチタスク、イベントの割り込みなんてのは日常茶飯事。 そのため送信信号が一定であっても受信が一定になること理論上あり得ません。 WM_KEYDOWNを受け取った時刻を100回記録して、それぞれの間のブレを測定すれば、 そのブレこそが精度の限界値というわけです。 なので私のPCでは 間隔平均は0.033037秒、 ってのは確認で 標準偏差は0.000063秒 これが大体信頼の置ける精度 最大誤差は0.0003秒(2%) これが大外れを起こしたときのズレ(大体2%の確立で起こる。) と言う意味。 もちろんソフトウェア制御なので、この精度は使っているハードウエア構成や、CPU使用率に大きく影響します。 また、WindowsAPIのシステムタイマは最小1msですから今回の計測には使えません。 Sleep関数も最小1msですから使ってはいけません。 WM_KEYDOWNはアプリケーションが受信を行わないとOSが溜め込む働きを持っています。 まーですが、今回は0.033秒以内に受信が完了しているのでそれはたいした問題ではありません。 あと、キー入力はOSの中でかなり優先度の高い信号なので、比較的優先されてOS内で処理されます。 でわ寝るぽ。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.