2014-05-08 37 views
0

我一直在研究分析寻找特定对象的帧的移动应用程序。该处理是沉重,我不断收到在分析帧时从主线程切换到多线程

05-08 17:44:24.909: I/Choreographer(31606): Skipped 114 frames! The application may be doing too much work on its main thread. 

所以我切换图像处理线程,现在它的速度要快得多,但我不能够认识任何对象。数据(不同的框架)没有更新,我不知道为什么。以下是我在伪正在做(SurfaceHolder.Callback,Camera.PreviewCallback和camera.addCallbackBuffer(数据)来实现)

public void onPreviewFrame(byte[] data, Camera camera) 
{ 
    Imageprocessor np = new ImageProcessor(data); 
    np.start() 
    results = np.getResults(); 
} 

从到目前为止,我已经做了我知道开始时分析整个调试框架,但是。数据没有更新,它保持堆叠在第一帧。这不会发生,如果我这样做在主线程这样,

public void onPreviewFrame(byte[] data, Camera camera) 
{ 
    Imageprocessor np = new ImageProcessor(); 
    np.process(data) 
    results = np.getResults(); 
} 

这样的作品,但它迫使我跳过很多帧。答案可能很简单,但我无法在网上找到它。

原谅我,如果我张贴一个很小白的问题提前

感谢

+0

我不能告诉它,因为它的伪代码,但你是否应用图像处理之前将缓冲区复制到自己的内存? –

+0

我有同样的isuue和它一周我无法解决这一个..你有任何帮助? –

回答

0

这是因为在单线程情况下,np.process()你执行results=...之前完成,但在螺纹的情况下,results=...紧接在开始线程之后。除非getResults()等待所有线程完成?

+0

是的,你是对的我不等待线程完成。但是这个问题仍然没有解决,'byte []'保持不变。在我开始线程之前,我比较了帧,我总是得到'old_frame = new_frame',我不明白为什么它总是相同的......比较检查每个像素的亮度值,如果pixel_brigthness_old_frame!= pixel_brigthness_new_frame返回false“。可悲的是,它总是返回true .. –

+0

是否因为你在线程之间没有正确同步?没有正确的同步,你的线程将不会看到另一个线程所做的内存更改。请参阅[本答案](http://stackoverflow.com/a/3519736/8946)以获得相当详细的概述。 –