指针事件丢失(队列溢出?)

时间:2019-01-30 21:59:03

标签: visual-c++ windows-10-universal

我已经用C ++编写了一个WUP应用程序(MS Developer Studio 2017,目标是10.0.17134.0)。从本质上讲,它是一种乐器模拟器,它响应PointerEntered和PointerExited事件,将笔划分配到Midi层。到目前为止,所有这些都可以正常运行,但是当应用程序处于压力状态(意味着我玩得更快或几乎同时按下多个按钮)时,我会丢失事件。这通过“粘滞”键显示(即使释放v按钮(代表键的边框对象),音符也会保持发声)。由于我还通过输入指针(打开颜色)和退出指针(关闭颜色)来更改v按钮的颜色,因此我可以看到未调用事件处理程序,这在Midi层上也不成问题(颜色保持不变)在释放v按钮时亮起)。我有理由相信,这不仅适用于PointerExited事件,而且还适用于PointerEntered事件(即使我清楚地触摸了相应的V-Button,通常也不会发出音符)。

由于调度逻辑位于框架的深处,因此我看不到调试此方法的明显方法。我怀疑这在触摸屏处理器内的内部队列中溢出(因为它主要显示在短时间内生成许多事件)。是否有办法在此级别上更改参数(例如队列深度)或获取有关通过系统物理生成或传播的事件的计数器?

谢谢!

编辑2/1/2019:我对代码进行了一些优化,到目前为止,该问题不再显示。对于那些感兴趣的人,这是导致问题的伪代码:

HandlerForPointer()
{
    IMidiMessage ^a_Msg = ref new <a midi message>;
    member_midiport->SendMessage(a_Msg);
}

通过使消息成为类实例成员变量并对其进行一次初始化,而不是每次这样都重新生成新消息:

HandlerForPointer()
{
    member_midiport->SendMessage(member_message);
}

我能够解决该问题(据我所知,回归测试仍在进行中)。这意味着消息的重新创建(构造函数的新的或调用的)或作用域末尾隐式删除引用占用了太多的CPU时间,UI线程导致消息队列溢出。验证这一点的正确方法是引入时间戳,然后测量经过的时间以确定在两种情况下的最大周转时间是多少。该性能计数器可能是此测量的正确入口点:doc link

对不起,谢谢。

0 个答案:

没有答案