我想写一个简单的C ++应用程序,注册到Windows传感器事件。 我遵循MSDN文档,并成功pipe理传感器事件发生时的通知,我的问题是,我的主要function结束,应用程序也是如此。 如何让它永远等待事件发生? 目前它注册并死亡…
我的主要看起来像这样:
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并实现其callback的类,例如:
DHT22和gpio如何工作?
是否可以从Silverlight访问Windows 7传感器和位置平台?
CoAP包的大小是多less?
访问设备的注册i2c
Windows 7,加速计和其他传感器
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); }
事件如预期发射。 但是听起来对我来说做这样的事情是非常错误的。
需要了解这是为什么发生。
谁能帮忙?
如何访问cpu的热传感器?
对禁用服务的请求:sns_main.c
检测盖旋转 – 联想Thinkpad瑜伽15
你为什么不启动一个新的线程来进行监听,只是让主函数等待输入?
如何模拟“按任意键继续?”
C ++线程的简单例子
你可以结合这些来获得你想要的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。