4

私はこのコードをセカンダリスレッドに持っています:

DWORD result = WaitForSingleObject(myhandle,10000);
if(result == WAIT_OBJECT_0){
    AfxMessageBox(_T(...));
}
else if(result  == WAIT_TIMEOUT){

    AfxMessageBox(_T("Timeout"));
}

常にではありませんが、WaitForSingleObjectが呼び出されるとすぐにタイムアウトが呼び出されることがあります(1秒の遅延もありません)。

私は何か間違ったことをしていますか?より安定した代替案について何か提案はありますか?


編集:

myhandleクラスコンストラクタ内で次のように作成されます。

myhandle = CreateEvent(NULL,FALSE,FALSE,_T("myhandle"));

別の関数によって呼び出されます。

SetEvent(myhandle);

重要なのは、SetEventを実行すると機能するということです。問題は、WaitForSingleObjectが呼び出されるとすぐに、10秒待つ必要があるにもかかわらずタイムアウトになることがあるということです。

4

3 に答える 3

1

名前付きイベントが本当に必要/必要ですか?通常、これはプロセス間の同時実行制御にのみ必要です。

このクラスのインスタンスが複数ある場合、それらはすべて同じイベントを使用します。すでに存在する名前付きオブジェクトの呼び出しについては、 CreateEventのドキュメントを参照してください。

ここで名前を削除するだけでよい場合があります。これにより、各クラスインスタンスが独自のEventオブジェクトを持つことができ、動作がより予測可能になります。

于 2012-04-25T14:11:41.930 に答える
1

WaitForSingleObject10秒全体を待つことはありません。次の最初のものを待ちます:

  1. タイムアウト値が経過した
  2. イベントが通知されます
  3. ハンドルが無効になります(別のスレッドで閉じられます)

呼び出し時にイベントが設定されている場合WaitForSingleObject、条件#2は最初から真であり、WaitForSingleObjectすぐに戻ります。

常に10秒待ちたい場合は、次のようなコードを使用する必要があります。

//Always wait 10 seconds
Sleep(10000); 

//Test the event without waiting
if(WaitForSingleObject(myhandle, 0) == WAIT_OBJECT_0) {
    AfxMessageBox(_T("Event was set in the last 10 secondes"));
} else {
    AfxMessageBox(_T("Timeout"));
}
于 2012-04-25T15:20:17.037 に答える
0

しばらく時間がかかりましたが、実際の問題は、プログラムがに複数の呼び出しを行うことがあることでしたWaitForSingleObject。つまり、タイムアウトしているのは前の呼び出しです。

解決策は、最初のイベントが設定されないことがわかっている場合にキャンセルイベントを使用WaitForMultipleObjectsして設定することです。そのため、タイマーは、再度呼び出される前にキャンセルされます。

于 2012-04-30T15:46:59.980 に答える