1

私がやろうとしているのはWM_TIMER、プロセス内のウィンドウでメッセージをキャッチして待つことです(ただし、私が制御できないメッセージです)。

AutoResetEventメッセージを待つためにを使用しようとしています。

このWaitForMaterialUpdateメソッドはNativeWindowをウィンドウに接続し、メッセージを受信するまでブロックします。

これは私が使用しているコードです:

public class MaterialEditorWindow : NativeWindow
{
    private const int WM_TIMER = 0x0113;

    private AutoResetEvent waiter;

    public void WaitForMaterialUpdate(IntPtr handle)
    {
        waiter = new AutoResetEvent(false);
        AssignHandle(handle);
        waiter.WaitOne(5000);
        ReleaseHandle();
    }

    protected override void WndProc(ref Message m)
    {
         if (m.Msg == WM_TIMER) waiter.Set();
         base.WndProc(ref m);
    }
}

私はあまりデバッグ可能な環境ではありませんがMessageBox、ウィンドウが実際WM_TIMERに待機期間中にメッセージを受信して​​いることを確認しましたWaitOneが、戻る前に常に5000ミリ秒のタイムアウト期間全体を待機しています。

私がどこで間違っているのか考えていますか?

4

1 に答える 1

1

WaitOne()ブロッキングコールです。UI スレッドは、戻る
までメッセージを受け取りません。WaitOne()UI スレッドがメッセージを受信したときに待機ハンドルを設定したため、デッドロックが発生しました。

バックグラウンド スレッドでこれを行うか、メッセージを受信したときに単にコールバックを呼び出す必要があります。

于 2012-12-31T16:49:27.917 に答える