2016-10-26 5 views
0

私のC++アプリケーションでは、Bluetoothの検出プロセスにサードパーティのライブラリを使用しています。私はそれを使用する方法を学ぶために提供された例を見ています。イベントベースのAPIをスレッドで使用する(ブロッキングモード)

自分のニーズに最も合った例は、Discovery(long timeout)関数を呼び出してBluetooth検出を開始する単純なGUIアプリケーションです。 この関数はimmediatlyを返します(GUIはフリーズされません)。はOnDeviceFoundと呼ばれ、新しいBTデバイスが検出されるとtimeoutが経過するとOnDiscoveryCompleteとなります。

ので(例の)GUIコンストラクタで、次のように定義された__hookがあります:

__hook(&BluetoothDiscovery::OnDiscoveryComplete, &m_Discovery, &BluetoothClientDlg::OnDiscoveryComplete); 

は今、私は自分のアプリケーションで同じことを実装する必要があり、それはウィンドウのアプリケーションが、コンソールではありませんWindowsサービスとして実行されるアプリケーションで、新しいデバイスを探している別のスレッドで継続的に発見しています。

実際、実装ではスレッドの検出に利用するため、イベントベースの検出手順は必要ありませんが、検出をブロックする必要があります。ライブラリは発見のためのブロッキングAPIを提供しません。

ここで質問があります:イベント機能をブロッキング機能で使用することは可能ですか?言い換えれば、スレッドのメインループで呼び出すことができる関数を、n秒ごとに作成して、検出プロシージャを実行し、そのイベントベースのライブラリAPIを使用してBluetoothデバイスを返すことは可能ですか?

+0

デバイスが見つかるたびにイベントが発生することに注意してください。ブロッキングコールを繰り返し、繰り返す必要があります。その周りのロジックがうまくいっていると仮定します(しかし、私はこの非同期モデルを保持することを検討します。なぜそうでないのですか?)次に、イベントハンドラから返されるシグナルを待つ別の関数を導入します。 found device –

+0

'scanForDevices()' - > 'connectToDiscoveredDevices()' - > 'sleepAWhile()' - > ...これが理由で、私のスレッドが無限ループを実行しているので、現在の非同期モデルは私のニーズに合っていません。このプロシージャで非同期モデルを使用する方法(私の制限)を見つけることができない – ABCplus

+0

私たちが話している関数は 'scanForDevices()'です:非同期であるためimmediatlyを返した場合、 'connectToDiscoveredDevices()'は常に空ですデバイスベクトルを入力として使用します。しかし、私が気づいていない別の実装/デザインがあるかもしれません。 – ABCplus

答えて

0

あなたが望むのは、発見スレッドが完了するまでメインスレッドが座っているセマフォであり、次にメインスレッドに目を覚ますよう通知します。

あなたが提案したようなアクティブな待ち時間は厄介であり、可能な場合は避けるべきです。

関連する問題