c# - 加速度计在一段时间后停止

标签 c# windows-runtime windows-phone-8.1 accelerometer win-universal-app

在我的应用程序中,我尝试使用 acceletometr 并且它有效,但它会在一段时间后停止。我不知道为什么,因为我异步运行它。

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 says :

    The application should consult the MinimumReportInterval property prior to setting the report interval to ensure that the sensor can honor the requested report interval. Setting a value below the minimum supported interval will either trigger an exception or have undefined results.

  • 第二件事 - 我认为您的 _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 毫秒触发一次 Dispatcher 并不是一个好主意,我会将加速度计值保存在某处并使用例如 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);
}

关于c# - 加速度计在一段时间后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27433635/

相关文章:

c# - 在 DrawText Wpf C# 中使用自定义字体

camera - Windows Phone 8.1 MediaCapture CapturePhotoToStorageFileAsync 内存泄漏

c# - 另一个快速排序计算器

c# - Silverlight 使用阈值转换值

windows-runtime - 什么是 WinRT 语言投影?

mef - 如何在 Metro 风格应用程序中获取导出值 (MEF)

winrt-xaml - ListPickerFlyout忽略Windows Phone 8.1中父页面的RequestedTheme

c# - 集线器控件中的固定标题

c# - 从代码构建 visual studio 解决方案

c# - WinRT 应用程序中的 DRY