从WinRT组件访问从托管代码不断更新的值

时间:2014-02-06 11:36:37

标签: c# wpf windows-phone-8 com windows-runtime

我正在编写一个应用程序,它将对Windows Phone 8上的实时预览图像进行一些处理。为了获得良好的性能,我决定使用新的sdk提供的本机接口。 Everythings工作正常,可以在原生侧初始化相机,并将帧输入到xaml中的Image组件。现在,我将编写将在OnFrameAvailable方法中运行的代码。

我的问题是从本机组件获取已处理的值。为了使事情变得尽可能简单,我只需在OnFrameAvailable中设置一个整数值,并通过WinRT组件编写一个这个值的访问器,以使其在托管端可访问。

我陷入了访问此值的优雅方式。当我尝试在线程中的循环中访问它时,我得到了臭名昭着的“尝试读取或写入受保护的内存”异常。我知道代码没有多大意义,但我试图最小化以指出问题。 我是这样做的:

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        nativeCapture = new NativeCapture();
        while (nativeCapture.Done == false) ;
        viewFinderBrush.SetSource(nativeCapture.NPhotoCaptureDevice);
        DrawElementThread = new Thread(drawElementsFunction);
        DrawElementThread.Start();
        base.OnNavigatedTo(e);
    }
    void drawElementsFunction()
    {
        while(true)
        {
            int a = nativeCapture.DetectedRectangleCoordinates; // Exception occurs here
        }

    }

在这里你还会注意到我正在考虑另一个值,完成,但我没有得到它的例外。但是,我应该注意,它只是在本机组件的构造函数中设置,而每次调用OnFrameAvailable时都会设置DetectedRectangleCoordinates,我希望无论何时相机的预览帧都可用。

因此,我怀疑WinRT组件可能存在某种锁定机制。每次名为DetectedRectangleCoordinates的OnFrameAvaible方法都变得无法访问。但是,我找不到关于此的陈述,也无法弄清楚如何调试这样的事情。

如果您向我提供与此或类似问题相关的一些指示,我将非常感激?它与WinRT组件中的访问机制有关吗?或者这是一个糟糕的线程练习我在做什么?如果是这样,我将如何同步托管代码和本机代码中的线程?

编辑: 在给出异常和步进的行上设置断点不会导致异常,并且我得到了预期的值。

编辑: 我在本机端的get函数上放了一个断点。这个指针在那里指向null。我无法理解为什么它是因为它是从刚构造的对象中调用的。 (nativeCapture对象)。

1 个答案:

答案 0 :(得分:0)

我已经花了很长时间来解决可能出错的问题,但是将代码添加到页面的Loaded事件处理程序解决了这个问题。我不确定它的相关性,但是当我在问题中给出的代码片段在OnNavigatedTo方法中运行时,nativeCapture组件可能在其方法上具有自我空指针(this->)。 我希望如果他们有类似的问题,这可以帮助人们。