diff --git a/src/main/java/com/sparrowwallet/sparrow/control/WebcamService.java b/src/main/java/com/sparrowwallet/sparrow/control/WebcamService.java index c143b414..6e076a5f 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/WebcamService.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/WebcamService.java @@ -29,6 +29,7 @@ import java.util.*; import java.util.List; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -36,7 +37,8 @@ import java.util.stream.Stream; public class WebcamService extends ScheduledService { private static final Logger log = LoggerFactory.getLogger(WebcamService.class); - private final Semaphore taskSemaphore = new Semaphore(1, true); + private final Semaphore taskSemaphore = new Semaphore(1); + private final AtomicBoolean cancelRequested = new AtomicBoolean(false); private List devices; private List availableDevices; @@ -110,7 +112,15 @@ public class WebcamService extends ScheduledService { return new Task<>() { @Override protected Image call() throws Exception { - taskSemaphore.acquire(); + if(cancelRequested.get() || isCancelled()) { + return null; + } + + if(!taskSemaphore.tryAcquire()) { + log.warn("Skipped execution of webcam capture task, another task is running"); + return null; + } + try { if(devices == null) { devices = capture.getDevices(); @@ -222,11 +232,13 @@ public class WebcamService extends ScheduledService { public void reset() { stream = null; zoomLimits = null; + cancelRequested.set(false); super.reset(); } @Override public boolean cancel() { + cancelRequested.set(true); boolean cancelled = super.cancel(); try { @@ -414,6 +426,10 @@ public class WebcamService extends ScheduledService { return opened; } + public boolean getCancelRequested() { + return cancelRequested.get(); + } + public static > T getNearestEnum(T target) { return getNearestEnum(target, target.getDeclaringClass().getEnumConstants()); } diff --git a/src/main/java/com/sparrowwallet/sparrow/control/WebcamView.java b/src/main/java/com/sparrowwallet/sparrow/control/WebcamView.java index a34f50fb..5e9b87f5 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/WebcamView.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/WebcamView.java @@ -61,7 +61,7 @@ public class WebcamView { }); service.valueProperty().addListener((observable, oldValue, newValue) -> { - if(newValue != null) { + if(newValue != null && !service.getCancelRequested()) { imageProperty.set(newValue); } });