2016-10-26 22 views
0

在我的C++應用程序中,我使用第三方庫進行藍牙發現過程。我正在查看提供的示例以瞭解如何使用它。在線程中使用基於事件的API(阻塞模式)

最符合我需求的示例是一個簡單的GUI應用程序,它調用庫中的Discovery(long timeout)函數以啓動藍牙發現。 該函數立即返回(以便GUI不凍結),並在發現新的BT設備後觸發__event,調用OnDeviceFoundOnDiscoveryComplete一旦timeout過去。

所以在GUI構造函數(例子)的存在是__hook定義是這樣的:

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

現在,我需要實現同我的應用程序,這不是一個窗口應用程序,但控制檯作爲Windows服務運行的應用程序,在尋找新設備的單獨線程上進行連續發現。

所以,實際上,由於我的實現使用線程進行發現,因此我不需要基於事件的發現過程,但我需要阻止發現。該庫不提供用於發現的阻塞API。

所以問題來了:是否可以在阻塞函數中使用基於事件的函數?換句話說,是否可以編寫一個函數,該函數可以在執行發現過程並返回所創建的藍牙設備(使用基於事件的庫API)的每個n秒的線程主循環中調用?

+0

請注意,每次找到設備時都會引發該事件。您的阻止呼叫需要重複並重復重複。假設周圍的邏輯是好的(但我會考慮保留這個異步模型,爲什麼不呢?!它不適合?),然後簡單地引入另一個函數,它將等待一個信號(從事件處理程序發出信號),然後返回發現設備 –

+0

當前的異步模型與我的需求不匹配,因爲我的線程運行了如下這樣的無限循環:''''''''''''''這就是爲什麼我找不到在這個過程中使用異步模型的方法(我的限制) – ABCplus

+0

我們討論的函數是'scanForDevices()':如果它是立即返回的,因爲它是異步的,'connectToDiscoveredDevices()'總是空設備矢量作爲輸入。但是也許有一個我不知道的另一個實現/設計。 – ABCplus

回答

0

你想要的是一個信號量,它是你的主線程所在,直到發現線程完成,然後通知你的主線程被喚醒。

積極等待你的建議是討厭的,應儘可能避免。