編集:自分で理由を見つけたようです。スレッドを開始する前に、キーボード デバイスを取得するのを忘れていました。幸いなことに、これは簡単な問題でした。kbd.Acquire(); を追加した後 スレッド呼び出しの前に、コードが機能し始めました。
もちろん、対応する kbd.Unacquire(); が必要になります。閉じるボタンのハンドラーで。
元の質問
私は DirectInput とスレッド化が初めてです。以下のコードの何が問題なのか、誰か教えてください。イベント ハンドラー スレッドをトリガーする通知を受け取ることはないようです。
【使用ブロック省略。現在、DirectInput には SlimDX を使用しています]
メイン フォーム クラスには、必要な変数の定義が含まれています。
public partial class MainForm : Form
{
private static bool appClosing = false;
private DirectInput directInput;
private Keyboard kbd;
private static AutoResetEvent kbdEvent = new AutoResetEvent(false);
Thread kbdThread = new Thread(new ThreadStart(Device_KeyboardInput));
//Application uses windows forms with default settings.
public MainForm()
{
InitializeComponent();
}
//When form is loaded, the intention is to properly init the variables and start the thread that should activated by DirectInput.
private void MainForm_Load(object sender, EventArgs e)
{
directInput = new DirectInput();
kbd = new Keyboard(directInput);
kbd.SetNotification(kbdEvent);
kbdThread.Start();
}
//Just as a first try, the application should show a simple message when it receives the signal. For a reason currently unknown to me, this never seems to happen.
static void Device_KeyboardInput() //object sender, EventArgs e)
{
while (!appClosing)
{
kbdEvent.WaitOne();
if (!appClosing)
{
MessageBox.Show("Keyboard event detected.");
}
}
}
//In order to properly stop the keyboard handler thread before closing, kbdEvent will be set.
private void btnClose_Click(object sender, EventArgs e)
{
// Ready to close
appClosing = true;
kbdEvent.Set();
Application.Exit();
}
}
どうしたの?