如何阻止线程直到另一个结束

时间:2013-06-22 15:09:55

标签: android multithreading opencv video-streaming frame

我正在开发一个Android应用程序,它使用opencv库提供的类org.opencv.android.JavaCameraView打开视频流,并从中捕获帧,以便在它们显示在屏幕上之前处理它们。

应用程序以这种方式组织:

  1. 主线程,具有OnCameraFrame方法,获取帧并将其发送到线程A,此方法还负责在屏幕上显示最终帧。因此,所有处理都应在获取帧之后,在屏幕上显示之前,在此方法的“中间”执行。

  2. 线程A,它将获取的帧保存到缓冲区中,BlockingLinkedQueue;

  3. 线程B,从缓冲区获取一个帧,并将其发送给负责处理的线程,线程C;

  4. 处理框架的线程C,并将其发送到主线程。

  5. 所以问题是:如何阻止方法OnCameraFrame,所以它不能在屏幕上显示任何帧,直到它从最后一个线程(C)返回?如果我没有实现这种类型的任何东西,由于处理需要一点时间,我没有在屏幕上正确看到最终帧。

    我希望我能清楚地解释我的问题。

2 个答案:

答案 0 :(得分:0)

该方法为Thread.join(),但通常不应在主线程中调用它。相反,你应该不在你的onCameraFrame()中显示任何内容,但在计算结束时,线程C可以调用例如Activity.runOnUiThread()。 {{1}}代码显示框架。

答案 1 :(得分:0)

最好避免阻塞回调 - 取决于调用线程,你可能最终得到ANR。在回调和处理线程之间添加一个队列。

我不确定为什么你需要这么多线程和阻塞队列 - 制作一个线程,在这个线程上创建一个Handler,在主线程上创建一个Handler。当你在回调中收到一个帧时 - 将它发布到处理线程处理程序,当它完成处理时 - 将结果发布到主线程处理程序。