0

スレッドが SetEvent を呼び出し、別のスレッドがそのイベントを待機するアプリケーションがあります。ただし、CreateEvent は呼び出されませんでした。

SetEven は false (ERROR_INVALID_HANDLE) を返し、WaitForSingleObject は WAIT_FAILED を返します。

昨日、明らかに関係のないことをコミットしました。ツールバーからボタンを削除する .rc 内の 2 行のコードです。

突然、realease-XP-32 でWaitForSingleObject が WAIT_TIMEOUT を返します

しかし、私は疑問に思います:

1- リソース内のコミット (明らかに無関係) が WaitForSingleObject の戻り値を変更したのはなぜですか?

2- Visual Studio からアプリケーション (XP32) を起動すると、アプリケーションを直接起動した場合とは異なる動作になります。WaitForSingleObject() は、タイムアウトではなく WAIT_FAILED を返します。理由はありますか?

4

2 に答える 2

2

を呼び出したことがないのでCreateEventSetEventWaitForSingleObjectは初期化されていない変数を使用していました。初期化されていない変数の内容は不定であるため、未知の値をSetEventおよびに渡すことになりWaitForSingleObjectます。古いコードでは、メモリ使用パターンにより、初期化されていない変数に有効なハンドルではない値が含まれているという状況が発生したようですERROR_INVALID_HANDLE。変更を行った後、メモリ使用パターンが変更され、初期化されていない変数の値がたまたま有効なハンドルになるため、WaitForSingleObject関数は忠実にそれを待ちます。そのハンドルはたまたま通知されていないオブジェクトを参照しているため、WaitForSingleObject呼び出しはタイムアウトして を返しますWAIT_FAILED

言い換えれば、一見関係のない変更によって、既存のバグが露呈したのです。初期化されていないデータを使用すると、このような非局所的な影響が生じる可能性があります。

于 2012-10-04T15:03:50.447 に答える
1

WaitForSingleObject()を実行している場合、その呼び出しは実際に失敗しましたか?おそらく、無効なハンドルエラーもスローしていたため、「イベントを受信して​​いる」ように見えただけです。また、壊れたCreateEvent()コードは、RCファイルが変更されるまで実際にコンパイルされなかった可能性もあります。いずれにせよ、コードを見ずに見分ける方法はありません。

于 2012-10-03T23:36:52.810 に答える