如何使我的C++程序永远等待传感器事件而不终止



我正在尝试编写一个简单的C++应用程序,用于注册Windows传感器事件。我遵循了 MSDN 文档并成功管理以在传感器事件发生时获得通知,我的问题是我的主要功能结束了,应用程序也结束了。我如何让它永远等待事件发生?目前它注册并死亡...

我有以下代码:

我的主要看起来像这样:

int _tmain(int argc, _TCHAR* argv[])
{
   RegisterToSensorEvents();
   return 0;
}
void RegisterToSensorEvents()
{
    ISensorManager* pSensorManager = NULL;
    CoInitialize(NULL);
    HRESULT hr = ::CoCreateInstance(CLSID_SensorManager, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pSensorManager));
    // Get a collection of all sensors on the computer.
    ISensorCollection* pSensorCollection = NULL;
    hr = pSensorManager->GetSensorsByCategory(SENSOR_CATEGORY_ALL, &pSensorCollection);
    EventsManager *pEventClass = NULL;
    ISensorEvents* pMyEvents = NULL;
    pEventClass = new(std::nothrow) EventsManager();   
    hr = pEventClass->QueryInterface(IID_PPV_ARGS(&pMyEvents));
    ULONG numOfSensors;
    pSensorCollection->GetCount(&numOfSensors);
    for(int i=0; i< numOfSensors; i++)
    {
        ISensor *sensor = NULL;
        pSensorCollection->GetAt(i,&sensor);
        hr = sensor->SetEventSink(pMyEvents);
    }
}

EventsManager 是一个派生自 ISensorEvents 并实现其回调的类,例如:

STDMETHODIMP EventsManager::OnDataUpdated(ISensor *pSensor,ISensorDataReport *pNewData)
{
    cout  <<"got here: Data Update" << endl;
}

我试过了:

 int _tmain(int argc, _TCHAR* argv[])
 {
   RegisterToSensorEvents();
   while(true){}
   return 0;
 }

但似乎这个无限循环没有给程序留下时间来处理传入的事件,我尝试在循环体中添加 Sleep,但它也没有用。

任何人?

更新:

经过调查,我发现问题有所不同 - 似乎不知何故我的 SetEventSink 注册被取消了,这就是为什么我没有收到任何事件通知的原因。

如果我复制这一行: hr = sensor->SetEventSink(pMyEvents);我的循环:

while(true)
{
   hr = sensor->SetEventSink(pMyEvents);
}

事件按预期触发。但在我看来,做这样的事情听起来很不对劲。

需要了解为什么会这样。

谁能帮忙?

为什么不启动一个新线程来监听,而只让 main 函数等待输入?

如何模拟"按任意键继续?

C++线程的简单示例

您可以将这些结合起来以获得所需的结果。

最新更新