gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:31:06 24 4
gpt4 key购买 nike

我正在尝试编写一个简单的 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);
}

事件按预期触发。但在我看来,这样做是非常错误的。

需要了解为什么会发生这种情况。

有人能帮忙吗?

最佳答案

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

How to simulate "Press any key to continue?"

Simple example of threading in C++

您可以组合这些以获得您想要的结果。

关于c++ - 如何使我的 C++ 程序永远等待传感器事件而不终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35693507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com