我正在尝试编写一个简单的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++线程的简单示例
您可以将这些结合起来以获得所需的结果。