【问题标题】:How to cause my C++ program to wait for sensor events for ever and not terminate如何使我的 C++ 程序永远等待传感器事件而不终止
【发布时间】:2016-03-06 18:13:17
【问题描述】:

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

但似乎这个无限循环没有留出时间让程序处理传入事件,我尝试在循环体中添加睡眠,但它也不起作用。

有人吗?

更新:

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

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

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

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

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

谁能帮忙?

【问题讨论】:

  • 你能提供确切的代码导致无限循环没有给你的代码适当的时间来执行某些东西吗?因为无限循环是不结束程序的解决方案。
  • 你是如何实际使用 Windows 消息事件循环的?
  • RegisterToSensorEvents 是某个库的众所周知的功能吗(我在 Google 上找不到)?否则,您应该提供更多信息。它是启动一个线程还是什么?否则,在这里,你的无限循环没有做任何事情,甚至没有读取事件,所以你的程序没有机会做任何事情!
  • @AchmadJP:不,它确实不是——或者至少不是一个好的。为什么要浪费所有这些 CPU 周期?如果你真的想停下来不做任何事情,你应该改用Sleep(INFINITE)。另见stackoverflow.com/questions/3592557/…

标签: c++ windows sensors


【解决方案1】:

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

How to simulate "Press any key to continue?"

Simple example of threading in C++

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

【讨论】:

  • 我的 main 现在看起来像这样: int _tmain(int argc, _TCHAR* argv[]) { std::thread registerToSensor(RegisterToSensor); registerToSensor.join();系统(“暂停”);返回0;并且它仍然无法正常工作 - 事件被触发了几次,就是这样,一旦我的程序达到暂停,事件就会停止
  • 它真的退出了吗?
  • 不,它只是在那里等待输入,但不会触发事件
  • 它实际上在哪里挂钩事件监听器?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
相关资源
最近更新 更多