Task Launcher - changed launcher to always start the background thread

before creating the dialog
This commit is contained in:
dragonmacher 2019-05-23 14:16:06 -04:00
parent 454ce9c817
commit 27f21edba7
19 changed files with 470 additions and 165 deletions

View file

@ -40,15 +40,20 @@ import ghidra.util.task.TaskMonitor;
* On ConcurrentQs that only allow one task to run at a time, when a task is cancelled,
* the next task can begin. Most likely, the thread that was running the cancelled
* task won't be free, and a new thread will be used to start running the next task.
*
* @param <I> the input type
* @param <R> the output type
*/
class FutureTaskMonitor<I, R> extends FutureTask<R> implements TaskMonitor {
private final ConcurrentQ<I, R> queue;
private final I item;
private final long id;
private volatile String lastMessage;
private volatile long currentProgress;
private volatile long maxProgress;
private volatile CancelledListener cancelledListener;
private volatile boolean isIndeterminate;
FutureTaskMonitor(ConcurrentQ<I, R> queue, Callable<R> callable, I item, long id) {
super(callable);
@ -103,6 +108,11 @@ class FutureTaskMonitor<I, R> extends FutureTask<R> implements TaskMonitor {
queue.progressMessageChanged(id, item, message);
}
@Override
public String getMessage() {
return lastMessage;
}
@Override
public void initialize(long max) {
currentProgress = 0;
@ -123,9 +133,15 @@ class FutureTaskMonitor<I, R> extends FutureTask<R> implements TaskMonitor {
@Override
public void setIndeterminate(boolean indeterminate) {
this.isIndeterminate = indeterminate;
queue.progressModeChanged(id, item, indeterminate);
}
@Override
public boolean isIndeterminate() {
return isIndeterminate;
}
@Override
public long getProgress() {
return currentProgress;

View file

@ -67,6 +67,11 @@ public class TaskMonitorAdapter implements TaskMonitor {
// do nothing
}
@Override
public String getMessage() {
return null;
}
@Override
public void setProgress(long value) {
// do nothing
@ -105,6 +110,11 @@ public class TaskMonitorAdapter implements TaskMonitor {
// do nothing
}
@Override
public boolean isIndeterminate() {
return false;
}
@Override
public synchronized void setCancelEnabled(boolean enable) {
cancelEnabled = enable;
@ -134,6 +144,8 @@ public class TaskMonitorAdapter implements TaskMonitor {
}
cancelled = false;
}
// TODO this seems like a mistake, to notify of 'cancelled' when clearning
notifyChangeListeners();
}

View file

@ -136,6 +136,11 @@ public class TaskMonitorSplitter {
parent.setIndeterminate(indeterminate);
}
@Override
public boolean isIndeterminate() {
return parent.isIndeterminate();
}
@Override
public void initialize(long newMax) {
setMaximum(newMax);
@ -152,7 +157,11 @@ public class TaskMonitorSplitter {
@Override
public void setMessage(String message) {
parent.setMessage(message);
}
@Override
public String getMessage() {
return parent.getMessage();
}
@Override

View file

@ -139,6 +139,11 @@ public class TimeoutTaskMonitor implements TaskMonitor {
delegate.setMessage(message);
}
@Override
public String getMessage() {
return delegate.getMessage();
}
@Override
public void setProgress(long value) {
delegate.setProgress(value);
@ -164,6 +169,11 @@ public class TimeoutTaskMonitor implements TaskMonitor {
delegate.setIndeterminate(indeterminate);
}
@Override
public boolean isIndeterminate() {
return delegate.isIndeterminate();
}
@Override
public void checkCanceled() throws CancelledException {
if (didTimeout()) {

View file

@ -15,6 +15,8 @@
*/
package ghidra.util.task;
import ghidra.util.datastruct.WeakDataStructureFactory;
import ghidra.util.datastruct.WeakSet;
import ghidra.util.exception.CancelledException;
/**
@ -24,7 +26,9 @@ import ghidra.util.exception.CancelledException;
*/
public class WrappingTaskMonitor implements TaskMonitor {
protected final TaskMonitor delegate;
private WeakSet<CancelledListener> listeners =
WeakDataStructureFactory.createCopyOnReadWeakSet();
protected TaskMonitor delegate;
/**
* Constructor
@ -35,6 +39,25 @@ public class WrappingTaskMonitor implements TaskMonitor {
this.delegate = delegate;
}
/**
* Sets the delegate of this wrapper to be the new value. The new delegate will be
* initialized with the current values of the existing delegate.
*
* @param newDelegate the new delegate
*/
public void setDelegate(TaskMonitor newDelegate) {
newDelegate.setMaximum(delegate.getMaximum());
newDelegate.setProgress(delegate.getProgress());
newDelegate.setMessage(delegate.getMessage());
newDelegate.setIndeterminate(delegate.isIndeterminate());
for (CancelledListener l : listeners) {
newDelegate.addCancelledListener(l);
delegate.removeCancelledListener(l);
}
this.delegate = newDelegate;
}
@Override
public boolean isCancelled() {
return delegate.isCancelled();
@ -50,6 +73,11 @@ public class WrappingTaskMonitor implements TaskMonitor {
delegate.setMessage(message);
}
@Override
public String getMessage() {
return delegate.getMessage();
}
@Override
public void setProgress(long value) {
delegate.setProgress(value);
@ -75,6 +103,11 @@ public class WrappingTaskMonitor implements TaskMonitor {
delegate.setIndeterminate(indeterminate);
}
@Override
public boolean isIndeterminate() {
return delegate.isIndeterminate();
}
@Override
public void checkCanceled() throws CancelledException {
delegate.checkCanceled();
@ -97,11 +130,13 @@ public class WrappingTaskMonitor implements TaskMonitor {
@Override
public void addCancelledListener(CancelledListener listener) {
listeners.add(listener);
delegate.addCancelledListener(listener);
}
@Override
public void removeCancelledListener(CancelledListener listener) {
listeners.remove(listener);
delegate.removeCancelledListener(listener);
}