ブロッキング機能を持つサードパーティのライブラリを使用しています。つまり、完了するまで戻りません。その呼び出しのタイムアウトを設定できます。
問題は、その関数がライブラリを特定の状態にすることです。その状態になるとすぐに、自分のコードから何かをする必要があります。私の最初の解決策は、別のスレッドでそれを行うことでした:
void LibraryWrapper::DoTheMagic(){
//...
boost::thread EnteredFooStateNotifier( &LibraryWrapper::EnterFooState, this );
::LibraryBlockingFunction( timeout_ );
//...
}
void LibraryWrapper::EnterFooState(){
::Sleep( 50 ); //Ensure ::LibraryBlockingFunction is called first
//Do the stuff
}
かなり厄介ですね。Sleep
::LibraryBlockingFunction は、以下で行うことの前に必ず呼び出す必要があるため、呼び出しを行う必要がありました。そうしないと、すべてが失敗します。しかし、50 ミリ秒待つのは保証としては不十分であり、この特定のタスクはできるだけ速く実行する必要があるため、これ以上待つことはできません。
これを行うより良い方法はありませんか?ライブラリのコードにアクセスできないと考えてください。ブースト ソリューションは大歓迎です。
更新: 回答の 1 つが言うように、ライブラリ API は定義されていません。問題を説明し、解決策を提案する電子メールを開発者に送信しました (つまり、非ブロッキング呼び出しを行い、状態の変化を通知する登録済みのコールバックにイベントを送信します)。それまでの間、タイムアウトを十分に高く設定して X の処理を確実に完了させ、呼び出し後の作業を実行する前にライブラリ関数が確実に呼び出されるように遅延を十分に高く設定しました。決定論的ではありませんが、ほとんどの場合は機能します。