加速器在一段时间后停止
本文关键字:一段时间 加速器 | 更新日期: 2023-09-27 18:33:59
在我的应用程序中,我尝试使用加速度,它可以工作,但一段时间后停止。我不知道为什么我异步运行它。
public void initAccelerometr()
{
var _accelerometer = Accelerometer.GetDefault();
if (_accelerometer != null)
{
// Establish the report interval
_accelerometer.ReportInterval = 2;
_accelerometer.ReadingChanged += new TypedEventHandler<Accelerometer, AccelerometerReadingChangedEventArgs>(accelerometrReadingChanged);
}
else { /* not supported */ }
}
async private void accelerometrReadingChanged(object sender, AccelerometerReadingChangedEventArgs e)
{
var dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher;
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
AccelerometerReading reading = e.Reading;
AccelerometrZ = String.Format("{0,5:0.0000}", reading.AccelerationZ);
});
}
有时当我移动手机时,它一直有效,但有时它只能工作几秒钟。
正如我所测试的那样,您需要更改几件事:
-
您没有使用最小值(可能(查阅报告间隔。在我的手机(Lumia 820(上,它是10毫秒 - 而且我认为它真的很低(2毫秒 - 呵呵 - 这不是手机,它是一个很好的测量设备;)。MSDN 还说:
在设置报告间隔之前,应用程序应查阅 MinimumReportInterval 属性,以确保传感器可以遵循请求的报告间隔。将值设置为低于支持的最小间隔将触发异常或产生未定义的结果。
-
第二件事 - 我认为你的
_accelerometer
可能是垃圾回收的 - 你把它定义为局部变量,我已将其移动到 MainPage 类:Accelerometer _accelerometer; public void initAccelerometr() { _accelerometer = Accelerometer.GetDefault(); if (_accelerometer != null) { Debug.WriteLine("Minimum report interval is: {0}", _accelerometer.MinimumReportInterval); _accelerometer.ReportInterval = _accelerometer.MinimumReportInterval; _accelerometer.ReadingChanged += new TypedEventHandler<Accelerometer, AccelerometerReadingChangedEventArgs>(accelerometrReadingChanged); } }
有了这两样东西,我的加速度计跑了 10 分钟,停不下来。我还认为每 10 毫秒触发调度程序不是一个好主意,我会将加速度计值保存在某处并使用例如 DispatcherTimer 来显示它们:
DispatcherTimer dTimer;
public MainPage()
{
this.InitializeComponent();
this.Loaded += (sender, e) =>
{
initAccelerometr();
dTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(100) };
dTimer.Tick += (sa, ea) => myText.Text = acceletometerValue;
dTimer.Start();
};
}
string acceletometerValue;
private void accelerometrReadingChanged(object sender, AccelerometerReadingChangedEventArgs e)
{
acceletometerValue = String.Format("{0,5:0.0000}", e.Reading.AccelerationZ);
}