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