私は、Win32 APIを使用してキーストロークイベントを処理するライブラリを用意しています。キーストロークが発生するたびに、2つの別々のイベントがほぼ同時に発生します(thisとthis)。私の図書館では、2種類のスレッドがあります。それぞれの種類のイベント(フックとロー)に1つずつあります。2つのほぼ同期イベントを待つための戦略
スレッド1(フック)は、スレッド2(未加工)を待ってからデータを取得します。現在、これを達成するために障壁のような仕組みが使用されています。どちらのイベントも実際に処理される前に両方のイベントが来なければなりません。ここまでは順調ですね。
しかし、問題があります(もちろん)。理想的な世界では、私はいつも両方のイベントを取得することが保証されます。残念ながら私が理解していない理由から、Windowsは2つのイベントのうちの1つを私に渡すことを決してしないことがあります(しばしば、別のアプリが一時的に入力に悩まされている)。そして、もし私が "Hello world"とタイプすると、スレッド1は "H"を処理しているかもしれないし、スレッド2は "H"イベントを得たことがなく、 "e"にスキップしているかもしれません。イベントが同期しなくなり、すべての地獄が緩んでしまいます。
基本的に私はこれを望んでいます。私はイベントを意味のある方法でペアにしたいと思っています。スレッド1が "H"イベントを取得し、スレッド2が "e"を取得した場合、(1)正しい "H"イベントを待つか、(2)タイムアウトするか(はい、スレッド1は正常に失敗する可能性がありますそれが必要ならば)。イベントはどちらも一定の時間枠内に入ってくるはずなので、これがリアルタイムプログラミングの仕事になると思います。
私はリアルタイムプログラミングについては何も知りません。これにはすでにソリューション/データ構造がありますか?もしそうなら、彼らは何ですか?もしそうでなければ、このタイプの問題に対しては一般的なアプローチは何でしょうか(時間的に近い2つのイベントを同期させておくこと)?
ありがとうございました。
なぜ両方を待っていますか? – bdonlan
APIを使用すると、キーストロークがどこで行われるかを制御できます。私は両方のことを行う能力が必要です(どのキーボードがそれを送信したかによって入力がどこになるかを制御します)。これはちょうどこのマッチングアップイベントで、今は恐ろしい頭痛です。 –
確かに、WM_KEYUP/WM_KEYDOWNメッセージは、入力フォーカスのあるウィンドウに移動するだけです... ...? – bdonlan