From 848f791d4ffd4abbc16f10c0f151a824f9303e49 Mon Sep 17 00:00:00 2001 From: srowen Date: Fri, 15 Feb 2008 17:51:43 +0000 Subject: [PATCH] Replaced busy wait with wait()/notifyAll() idiom git-svn-id: https://zxing.googlecode.com/svn/trunk@206 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- .../zxing/client/android/WorkerThread.java | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/android/src/com/google/zxing/client/android/WorkerThread.java b/android/src/com/google/zxing/client/android/WorkerThread.java index 7c47a07e1..915a05d0b 100644 --- a/android/src/com/google/zxing/client/android/WorkerThread.java +++ b/android/src/com/google/zxing/client/android/WorkerThread.java @@ -32,9 +32,11 @@ import com.google.zxing.Result; */ final class WorkerThread extends Thread { - private CameraSurfaceView surfaceView; - private CameraManager cameraManager; - private Handler handler; + private final CameraSurfaceView surfaceView; + private final CameraManager cameraManager; + private final Handler handler; + private final Object idleLock; + private State state; private enum State { IDLE, @@ -43,12 +45,11 @@ final class WorkerThread extends Thread { DONE } - private State state; - WorkerThread(CameraSurfaceView surfaceView, CameraManager cameraManager, Handler handler) { this.surfaceView = surfaceView; this.cameraManager = cameraManager; this.handler = handler; + this.idleLock = new Object(); state = State.IDLE; } @@ -57,10 +58,7 @@ final class WorkerThread extends Thread { while (true) { switch (state) { case IDLE: - try { - sleep(50); - } catch (InterruptedException e) { - } + idle(); break; case PREVIEW_LOOP: surfaceView.capturePreviewAndDraw(); @@ -89,18 +87,37 @@ final class WorkerThread extends Thread { public void requestPreviewLoop() { state = State.PREVIEW_LOOP; + wakeFromIdle(); } public void requestStillAndDecode() { state = State.STILL_AND_DECODE; + wakeFromIdle(); } public void requestExitAndWait() { state = State.DONE; + wakeFromIdle(); try { join(); } catch (InterruptedException e) { } } + private void idle() { + try { + synchronized (idleLock) { + idleLock.wait(); + } + } catch (InterruptedException ie) { + // continue + } + } + + private void wakeFromIdle() { + synchronized (idleLock) { + idleLock.notifyAll(); + } + } + }