Skip to content

Commit

Permalink
Sync progress logging rate changes, avoid concurrent mod. in GUI
Browse files Browse the repository at this point in the history
  • Loading branch information
kno10 committed Jan 24, 2018
1 parent de8275f commit 9d9ffab
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 52 deletions.
Expand Up @@ -132,30 +132,32 @@ private JProgressBar getOrCreateProgressBar(Progress prog) {
JProgressBar pbar = pbarmap.get(prog);
// Add a new progress bar.
if(pbar == null) {
if(prog instanceof FiniteProgress) {
pbar = new JProgressBar(0, ((FiniteProgress) prog).getTotal());
pbar.setStringPainted(true);
}
else if(prog instanceof IndefiniteProgress) {
pbar = new JProgressBar();
pbar.setIndeterminate(true);
pbar.setStringPainted(true);
}
else if(prog instanceof MutableProgress) {
pbar = new JProgressBar(0, ((MutableProgress) prog).getTotal());
pbar.setStringPainted(true);
}
else {
throw new RuntimeException("Unsupported progress record");
}
pbarmap.put(prog, pbar);
final JProgressBar pbar2 = pbar;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
addProgressBar(pbar2);
synchronized(pbarmap) {
if(prog instanceof FiniteProgress) {
pbar = new JProgressBar(0, ((FiniteProgress) prog).getTotal());
pbar.setStringPainted(true);
}
});
else if(prog instanceof IndefiniteProgress) {
pbar = new JProgressBar();
pbar.setIndeterminate(true);
pbar.setStringPainted(true);
}
else if(prog instanceof MutableProgress) {
pbar = new JProgressBar(0, ((MutableProgress) prog).getTotal());
pbar.setStringPainted(true);
}
else {
throw new RuntimeException("Unsupported progress record");
}
pbarmap.put(prog, pbar);
final JProgressBar pbar2 = pbar;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
addProgressBar(pbar2);
}
});
}
}
return pbar;
}
Expand Down Expand Up @@ -192,24 +194,28 @@ else if(prog instanceof MutableProgress) {
* @param pbar Associated progress bar
*/
private void removeProgressBar(Progress prog, JProgressBar pbar) {
pbarmap.remove(prog);
final JProgressBar pbar2 = pbar;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
removeProgressBar(pbar2);
}
});
synchronized(pbarmap) {
pbarmap.remove(prog);
final JProgressBar pbar2 = pbar;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
removeProgressBar(pbar2);
}
});
}
}

/**
* Clear the current contents.
*/
public void clear() {
logpane.clear();
for(Entry<Progress, JProgressBar> ent : pbarmap.entrySet()) {
super.remove(ent.getValue());
pbarmap.remove(ent.getKey());
synchronized(pbarmap) {
for(Entry<Progress, JProgressBar> ent : pbarmap.entrySet()) {
super.remove(ent.getValue());
pbarmap.remove(ent.getKey());
}
}
}

Expand Down Expand Up @@ -267,4 +273,4 @@ public void publish(final LogRecord record) {
LogPanel.this.publish(record);
}
}
}
}
Expand Up @@ -96,7 +96,7 @@ protected void setProcessed(int processed) throws IllegalArgumentException {
*/
public void setProcessed(int processed, Logging logger) throws IllegalArgumentException {
setProcessed(processed);
if(testLoggingRate()) {
if(testLoggingRate(processed)) {
logger.progress(this);
}
}
Expand Down Expand Up @@ -127,7 +127,7 @@ public int getProcessed() {
*/
@Override
public String toString() {
return appendToBuffer(new StringBuilder()).toString();
return appendToBuffer(new StringBuilder(200)).toString();
}

/**
Expand All @@ -136,31 +136,35 @@ public String toString() {
* @param logger Logger to report to.
*/
public void incrementProcessed(Logging logger) {
this.processed.incrementAndGet();
if(testLoggingRate()) {
if(testLoggingRate(this.processed.incrementAndGet())) {
logger.progress(this);
}
}

/**
* Logging rate control.
*
*
* @param processed Counter
* @return true when logging is sensible
*/
protected boolean testLoggingRate() {
final int processed = getProcessed();
protected boolean testLoggingRate(int processed) {
final long now = System.currentTimeMillis();
final long age = now - lastLogged;
if(!isComplete() && processed > 10 && age < 5E2) {
return false;
if(processed > 10 && now - lastLogged < 5E2) {
return isComplete();
}
if(lastValue > 0) {
int increment = processed - lastValue;
double newrate = increment / (double) age;
ratems = ratems != ratems ? newrate : (.95 * ratems + .05 * newrate);
synchronized(this) {
final long age = now - lastLogged;
if (age < 5E2) { // Probably another thread.
return isComplete();
}
if(lastValue > 0) {
int increment = processed - lastValue;
double newrate = increment / (double) age;
ratems = ratems != ratems ? newrate : (.95 * ratems + .05 * newrate);
}
lastValue = processed;
lastLogged = now;
}
lastValue = processed;
lastLogged = now;
return true;
}
}
}

0 comments on commit 9d9ffab

Please sign in to comment.