2013-06-22 2 views
0

Я разрабатываю приложение для Android, которое открывает видеопоток, используя класс org.opencv.android.JavaCameraView, предлагаемый библиотеками opencv, и захватывает кадры из него, чтобы обработать их прежде чем они будут показаны на экране.Как заблокировать поток до другого конца

Приложение организовано таким образом:

  1. в главном потоке, который имеет метод OnCameraFrame, которая приобретает кадр и отправить его в потоке А, и этот метод также отвечает за отображение конечного кадр на экране. Поэтому вся обработка должна выполняться после того, как кадр был получен, и до того, как он будет показан на экране, в «середине» этого метода.

  2. нить A, которая сохраняет кадр, полученный в буфер, BlockingLinkedQueue;

  3. нить B, которая берет кадр из буфера и отправляет его в поток, ответственный за обработку, поток C;

  4. нить C, которая обрабатывает рамку и отправляет ее в основной поток.

Таким образом, вопрос: как я могу блокировать метод OnCameraFrame, поэтому он не может показать любой кадр на экране, до тех пор, пока не вернулся из последнего потока (C)? Если я не реализую ничего такого типа, из-за обработки требуется немного времени, я не вижу окончательный кадр правильно на экране.

Надеюсь, я ясно объяснил свою проблему.

ответ

0

Метод будет Thread.join(), но обычно вы не должны называть его основной темой. Вместо этого вы должны просто ничего не показывать в своем onCameraFrame(), но в конце потока вычислений C может звонить, например. Activity.runOnUiThread() с кодом для отображения кадра.

0

Лучше избегать блокировки обратных вызовов - в зависимости от вызывающего потока вы можете получить ANR. Добавьте очередь между обратным вызовом и потоком обработки.

Я не уверен, почему вам нужно столько потоков и блокировка очереди - создайте один поток, создайте обработчик в этой теме и обработчик в основном потоке. Когда вы получаете фрейм в обратном вызове - отправляйте его обработчику потока обработки, когда он будет обработан - отправьте результаты в обработчик основного потока.

Смежные вопросы