在线程中使用基于事件的API(阻塞模式)

Using event based API in a thread (blocking mode)

本文关键字:线程 API 模式 事件 于事件      更新时间:2023-10-16

在我的C++应用程序中,我使用第三方库进行蓝牙发现过程。我正在看提供的例子来学习如何使用它

最符合我需求的例子是一个简单的GUI应用程序,它从库中调用Discovery(long timeout)函数来启动蓝牙发现。该函数立即返回(以便GUI不被冻结(,并在发现新的BT设备后激发称为OnDeviceFound__event,在经过timeout后激发OnDiscoveryComplete

因此,在GUI构造函数(示例(中,__hook定义如下:

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

现在,我需要在我的应用程序中实现同样的功能,这不是一个窗口应用程序,而是一个作为Windows服务运行的控制台应用程序,在一个单独的线程上进行连续的发现,以寻找新设备。

所以,实际上,由于我的实现使用线程进行发现,所以我不需要基于事件的发现过程,但我需要一个阻塞发现。库不提供用于发现的阻止API。

所以问题来了:在阻塞函数中使用基于事件的函数可能吗?换句话说,是否可以编写一个函数,该函数可以在线程主循环中每隔n秒调用一次,以执行发现过程并返回已建立的蓝牙设备(使用基于事件的库API(?

您想要的是一个Semaphore,您的主线程一直坐在它上,直到发现线程完成,然后通知主线程唤醒。

像你建议的积极等待是令人讨厌的,应该尽可能避免。