From a8ac936e9216ba190c9a2a51ce9e3790685700ec Mon Sep 17 00:00:00 2001 From: hneemann Date: Tue, 2 Apr 2019 14:43:38 +0200 Subject: [PATCH 1/5] If the optimization takes a long time, a new thread is generated to perform the calculations. --- .../digital/analyse/BoolTableExpanded.java | 5 ++ .../digital/analyse/quinemc/BoolTable.java | 7 ++ .../table/BuilderExpressionCreator.java | 1 + .../components/table/ExpressionCreator.java | 79 ++++++++++++----- .../table/ExpressionListenerStore.java | 1 - .../gui/components/table/TableDialog.java | 85 ++++++++++++++----- src/main/resources/lang/lang_de.xml | 1 + src/main/resources/lang/lang_en.xml | 1 + 8 files changed, 139 insertions(+), 41 deletions(-) diff --git a/src/main/java/de/neemann/digital/analyse/BoolTableExpanded.java b/src/main/java/de/neemann/digital/analyse/BoolTableExpanded.java index c2687b691..9df68197a 100644 --- a/src/main/java/de/neemann/digital/analyse/BoolTableExpanded.java +++ b/src/main/java/de/neemann/digital/analyse/BoolTableExpanded.java @@ -78,4 +78,9 @@ public class BoolTableExpanded implements BoolTable { public ArrayList getVars() { return vars; } + + @Override + public int realSize() { + return e.realSize(); + } } diff --git a/src/main/java/de/neemann/digital/analyse/quinemc/BoolTable.java b/src/main/java/de/neemann/digital/analyse/quinemc/BoolTable.java index a1c7b922e..b72d9a87c 100644 --- a/src/main/java/de/neemann/digital/analyse/quinemc/BoolTable.java +++ b/src/main/java/de/neemann/digital/analyse/quinemc/BoolTable.java @@ -21,4 +21,11 @@ public interface BoolTable { * @return the value */ ThreeStateValue get(int i); + + /** + * @return the real size of the bool table + */ + default int realSize() { + return size(); + } } diff --git a/src/main/java/de/neemann/digital/gui/components/table/BuilderExpressionCreator.java b/src/main/java/de/neemann/digital/gui/components/table/BuilderExpressionCreator.java index 0cb245f30..b3ced42fb 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/BuilderExpressionCreator.java +++ b/src/main/java/de/neemann/digital/gui/components/table/BuilderExpressionCreator.java @@ -74,6 +74,7 @@ public class BuilderExpressionCreator { el = new ExpressionListenerOptimizeJK(el); expressions.replayTo(el); + el.close(); } /** diff --git a/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java b/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java index 53e04ab4e..46aaa112b 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java +++ b/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java @@ -6,7 +6,6 @@ package de.neemann.digital.gui.components.table; import de.neemann.digital.analyse.*; -import de.neemann.digital.analyse.expression.Expression; import de.neemann.digital.analyse.expression.ExpressionException; import de.neemann.digital.analyse.expression.Variable; import de.neemann.digital.analyse.expression.format.FormatterException; @@ -17,7 +16,9 @@ import de.neemann.digital.lang.Lang; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -29,6 +30,7 @@ import java.util.concurrent.TimeUnit; public class ExpressionCreator { private static final Logger LOGGER = LoggerFactory.getLogger(ExpressionCreator.class); private static final int MAX_INPUTS_ALLOWED = 12; + private static final int COMPLEX_VAR_SIZE = 8; private final TruthTable theTable; @@ -52,38 +54,55 @@ public class ExpressionCreator { public void create(ExpressionListener listener) throws ExpressionException, FormatterException, AnalyseException { final List vars = Collections.unmodifiableList(theTable.getVars()); long time = System.currentTimeMillis(); - if (theTable.getResultCount() > 100) { + if (theTable.getResultCount() >= 4 && vars.size() > COMPLEX_VAR_SIZE) { + LOGGER.info("use parallel solvers"); ExecutorService ex = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); - ThreadSaveExpressionListener threadListener = new ThreadSaveExpressionListener(listener); + + ArrayList jobs = new ArrayList<>(); for (int table = 0; table < theTable.getResultCount(); table++) { - final int t = table; + final ExpressionListenerStore l = new ExpressionListenerStore(null); + jobs.add(simplify(l, vars, theTable.getResultName(table), theTable.getResult(table)) + .setStorage(l)); + } + + LOGGER.info("jobs: " + jobs.size()); + + ArrayList orderedJobs = new ArrayList<>(jobs); + orderedJobs.sort(Comparator.comparingInt(job -> -job.getComplexity())); + + for (Job j : orderedJobs) { ex.submit(() -> { try { - simplify(listener, vars, theTable.getResultName(t), theTable.getResult(t)); - } catch (ExpressionException | FormatterException | AnalyseException e) { + j.run(); + j.close(); + } catch (ExpressionException | FormatterException e) { e.printStackTrace(); } }); } + ex.shutdown(); try { ex.awaitTermination(100, TimeUnit.HOURS); } catch (InterruptedException e) { e.printStackTrace(); } - threadListener.close(); + + for (Job j : jobs) + j.getStorage().replayTo(listener); + } else { for (int table = 0; table < theTable.getResultCount(); table++) - simplify(listener, vars, theTable.getResultName(table), theTable.getResult(table)); - listener.close(); + simplify(listener, vars, theTable.getResultName(table), theTable.getResult(table)).run(); } + listener.close(); time = System.currentTimeMillis() - time; LOGGER.debug("time: " + time / 1000.0 + " sec"); } - private void simplify(ExpressionListener listener, List vars, String resultName, BoolTable boolTable) throws AnalyseException, ExpressionException, FormatterException { + private Job simplify(ExpressionListener listener, List vars, String resultName, BoolTable boolTable) throws AnalyseException, ExpressionException { List localVars = vars; - if (vars.size()>4) { + if (vars.size() > 4) { TableReducer tr = new TableReducer(vars, boolTable); if (tr.canReduce()) { LOGGER.debug(resultName + " reduced from " + vars.size() + " to " + tr.getVars().size() + " variables (" + tr.getVars() + ")"); @@ -97,7 +116,7 @@ public class ExpressionCreator { listener = new CheckResultListener(listener, localVars, boolTable); - getMinimizer(localVars.size()).minimize(localVars, boolTable, resultName, listener); + return new Job(localVars, boolTable, resultName, listener); } private MinimizerInterface getMinimizer(int size) { @@ -108,22 +127,42 @@ public class ExpressionCreator { } } - - private final static class ThreadSaveExpressionListener implements ExpressionListener { + private final class Job { + private final List localVars; + private final BoolTable boolTable; + private final String resultName; private final ExpressionListener listener; + private ExpressionListenerStore storage; - private ThreadSaveExpressionListener(ExpressionListener listener) { + private Job(List localVars, BoolTable boolTable, String resultName, ExpressionListener listener) { + this.localVars = localVars; + this.boolTable = boolTable; + this.resultName = resultName; this.listener = listener; } - @Override - public synchronized void resultFound(String name, Expression expression) throws FormatterException, ExpressionException { - listener.resultFound(name, expression); + private void run() throws ExpressionException, FormatterException { + LOGGER.info("start job with complexity " + getComplexity()); + long time = System.currentTimeMillis(); + getMinimizer(localVars.size()).minimize(localVars, boolTable, resultName, listener); + LOGGER.info("finished job with complexity " + getComplexity() + ": " + (System.currentTimeMillis() - time) / 1000 + "sec"); } - @Override - public synchronized void close() throws FormatterException, ExpressionException { + private int getComplexity() { + return boolTable.realSize(); + } + + private void close() throws FormatterException, ExpressionException { listener.close(); } + + private ExpressionListenerStore getStorage() { + return storage; + } + + private Job setStorage(ExpressionListenerStore storage) { + this.storage = storage; + return this; + } } } diff --git a/src/main/java/de/neemann/digital/gui/components/table/ExpressionListenerStore.java b/src/main/java/de/neemann/digital/gui/components/table/ExpressionListenerStore.java index 73c537af2..2a4a667b8 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/ExpressionListenerStore.java +++ b/src/main/java/de/neemann/digital/gui/components/table/ExpressionListenerStore.java @@ -62,7 +62,6 @@ public class ExpressionListenerStore implements ExpressionListener { for (Result r : results) listener.resultFound(r.name, r.expression.copy()); - listener.close(); } /** diff --git a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java index e43ed273f..ae4c28586 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java @@ -5,7 +5,10 @@ */ package de.neemann.digital.gui.components.table; -import de.neemann.digital.analyse.*; +import de.neemann.digital.analyse.AnalyseException; +import de.neemann.digital.analyse.ModelAnalyserInfo; +import de.neemann.digital.analyse.TruthTable; +import de.neemann.digital.analyse.TruthTableTableModel; import de.neemann.digital.analyse.expression.Expression; import de.neemann.digital.analyse.expression.ExpressionException; import de.neemann.digital.analyse.expression.Variable; @@ -41,6 +44,8 @@ import de.neemann.gui.ErrorMessage; import de.neemann.gui.MyFileChooser; import de.neemann.gui.Screen; import de.neemann.gui.ToolTipAction; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.swing.*; import javax.swing.event.TableModelEvent; @@ -61,8 +66,10 @@ import java.util.StringTokenizer; import java.util.prefs.Preferences; /** + * */ public class TableDialog extends JDialog { + private static final Logger LOGGER = LoggerFactory.getLogger(TableDialog.class); private static final Preferences PREFS = Preferences.userRoot().node("dig").node("generator"); private static final Color MYGRAY = new Color(230, 230, 230); private static final List LIST = new ArrayList<>(); @@ -304,6 +311,7 @@ public class TableDialog extends JDialog { if (createJK.isSelected()) expressionListener = new ExpressionListenerJK(expressionListener); lastGeneratedExpressions.replayTo(expressionListener); + expressionListener.close(); } catch (ExpressionException | FormatterException e1) { new ErrorMessage(Lang.get("msg_errorDuringCalculation")).addCause(e1).show(TableDialog.this); } @@ -584,16 +592,51 @@ public class TableDialog extends JDialog { private void calculateExpressions() { try { + LOGGER.info("start optimization"); ExpressionListener expressionListener = new HTMLExpressionListener(); if (createJK.isSelected()) expressionListener = new ExpressionListenerJK(expressionListener); - lastGeneratedExpressions = new ExpressionListenerStore(expressionListener); - new ExpressionCreator(model.getTable()).create(lastGeneratedExpressions); + final TruthTable table = model.getTable(); + if (table.getResultCount() > 4 && table.getVars().size() > 8) { + if (!allSolutionsDialog.isVisible()) + allSolutionsDialog.setVisible(true); + allSolutionsDialog.setText(Lang.get("msg_optimizationInProgress")); + ExpressionListener finalExpressionListener = expressionListener; + new Thread(() -> { + ExpressionListenerStore storage = new ExpressionListenerStore(null); + try { + new ExpressionCreator(table).create(storage); + } catch (ExpressionException | FormatterException | AnalyseException e) { + SwingUtilities.invokeLater(() -> { + allSolutionsDialog.setVisible(false); + lastGeneratedExpressions = null; + new ErrorMessage(Lang.get("msg_errorDuringCalculation")).addCause(e).show(this); + }); + return; + } - kvMap.setResult(model.getTable(), lastGeneratedExpressions.getResults()); + SwingUtilities.invokeLater(() -> { + try { + lastGeneratedExpressions = new ExpressionListenerStore(finalExpressionListener); + storage.replayTo(lastGeneratedExpressions); + lastGeneratedExpressions.close(); + kvMap.setResult(table, lastGeneratedExpressions.getResults()); + } catch (FormatterException | ExpressionException e) { + lastGeneratedExpressions = null; + new ErrorMessage(Lang.get("msg_errorDuringCalculation")).addCause(e).show(this); + } + }); + }).start(); + } else { + lastGeneratedExpressions = new ExpressionListenerStore(expressionListener); + new ExpressionCreator(table).create(lastGeneratedExpressions); + kvMap.setResult(table, lastGeneratedExpressions.getResults()); + } + + LOGGER.info("optimization finished"); } catch (ExpressionException | FormatterException | AnalyseException e1) { lastGeneratedExpressions = null; new ErrorMessage(Lang.get("msg_errorDuringCalculation")).addCause(e1).show(this); @@ -731,22 +774,24 @@ public class TableDialog extends JDialog { public void close() { html.append(""); - switch (count) { - case 0: - statusBar.setVisible(false); - allSolutionsDialog.setVisible(false); - break; - case 1: - statusBar.setVisible(true); - statusBar.setText(firstExp); - allSolutionsDialog.setVisible(false); - break; - default: - statusBar.setVisible(false); - allSolutionsDialog.setText(html.toString()); - if (!allSolutionsDialog.isVisible()) - SwingUtilities.invokeLater(() -> allSolutionsDialog.setVisible(true)); - } + SwingUtilities.invokeLater(() -> { + switch (count) { + case 0: + statusBar.setVisible(false); + allSolutionsDialog.setVisible(false); + break; + case 1: + statusBar.setVisible(true); + statusBar.setText(firstExp); + allSolutionsDialog.setVisible(false); + break; + default: + statusBar.setVisible(false); + allSolutionsDialog.setText(html.toString()); + if (!allSolutionsDialog.isVisible()) + allSolutionsDialog.setVisible(true); + } + }); } } diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index ab6a4689b..0056c1d32 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -918,6 +918,7 @@ Es sind nur {1} Variablen erlaubt, es wurden jedoch {2} gefunden. Der Prozess meldet den Rückgabewert {0}: {1} Fehler beim Starten des externen Fitters! Es liegen keine minimierten Gleichungen vor! + Gleichungen werden berechnet! Einen Moment Geduld! Die Variable {0} wird mehrfach verwendet! Die Datei muss zunächst gespeichert werden! Die Schaltung {0} bindet sich selbst ein! diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index f9e0cbb70..542b41448 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -912,6 +912,7 @@ The process returns the non zero value {0}: {1} Error starting the external fitter! There are no minimized equations! + Equations are calculated! Please wait a moment! The variable {0} is used twice! The file needs to be saved! The circuit {0} imports itself! From b3ba34fe9c0f72b009b88158b3c4fbaa2fa4b00d Mon Sep 17 00:00:00 2001 From: hneemann Date: Tue, 2 Apr 2019 22:42:29 +0200 Subject: [PATCH 2/5] added a progress bar --- .../components/table/ExpressionCreator.java | 25 ++++++++++ .../gui/components/table/ProgressDialog.java | 47 +++++++++++++++++++ .../gui/components/table/TableDialog.java | 11 +++-- 3 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 src/main/java/de/neemann/digital/gui/components/table/ProgressDialog.java diff --git a/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java b/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java index 46aaa112b..8f97e876b 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java +++ b/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java @@ -33,6 +33,7 @@ public class ExpressionCreator { private static final int COMPLEX_VAR_SIZE = 8; private final TruthTable theTable; + private ProgressListener progressListener; /** * Creates a new instance @@ -98,6 +99,8 @@ public class ExpressionCreator { listener.close(); time = System.currentTimeMillis() - time; LOGGER.debug("time: " + time / 1000.0 + " sec"); + if (progressListener!=null) + progressListener.complete(); } private Job simplify(ExpressionListener listener, List vars, String resultName, BoolTable boolTable) throws AnalyseException, ExpressionException { @@ -127,6 +130,26 @@ public class ExpressionCreator { } } + public ExpressionCreator setProgressListener(ProgressListener progressListener) { + this.progressListener = progressListener; + return this; + } + + /** + * Listener used to monitor the progress + */ + public interface ProgressListener { + /** + * Called if a equation is calculated + */ + void oneCompleted(); + + /** + * Called if all equations are calculated + */ + void complete(); + } + private final class Job { private final List localVars; private final BoolTable boolTable; @@ -146,6 +169,8 @@ public class ExpressionCreator { long time = System.currentTimeMillis(); getMinimizer(localVars.size()).minimize(localVars, boolTable, resultName, listener); LOGGER.info("finished job with complexity " + getComplexity() + ": " + (System.currentTimeMillis() - time) / 1000 + "sec"); + if (progressListener!=null) + progressListener.oneCompleted(); } private int getComplexity() { diff --git a/src/main/java/de/neemann/digital/gui/components/table/ProgressDialog.java b/src/main/java/de/neemann/digital/gui/components/table/ProgressDialog.java new file mode 100644 index 000000000..9e970df0a --- /dev/null +++ b/src/main/java/de/neemann/digital/gui/components/table/ProgressDialog.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2019 Helmut Neemann. + * Use of this source code is governed by the GPL v3 license + * that can be found in the LICENSE file. + */ +package de.neemann.digital.gui.components.table; + +import de.neemann.digital.lang.Lang; + +import javax.swing.*; +import java.awt.*; + +public class ProgressDialog extends JDialog implements ExpressionCreator.ProgressListener { + private final JProgressBar bar; + private int prog; + + /** + * Create a new instance + * + * @param tableDialog the table dialog + */ + public ProgressDialog(TableDialog tableDialog) { + super(tableDialog,false); + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + + bar = new JProgressBar(0, tableDialog.getModel().getTable().getResultCount()); + bar.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); + final JLabel label = new JLabel(Lang.get("msg_optimizationInProgress")); + label.setBorder(BorderFactory.createEmptyBorder(5,5,0,5)); + getContentPane().add(label, BorderLayout.NORTH); + getContentPane().add(bar, BorderLayout.SOUTH); + + pack(); + setLocationRelativeTo(tableDialog); + SwingUtilities.invokeLater(() -> setVisible(true)); + } + + @Override + public void oneCompleted() { + SwingUtilities.invokeLater(() -> bar.setValue(++prog)); + } + + @Override + public void complete() { + SwingUtilities.invokeLater(this::dispose); + } +} diff --git a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java index ae4c28586..83effa8ac 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java @@ -599,15 +599,16 @@ public class TableDialog extends JDialog { expressionListener = new ExpressionListenerJK(expressionListener); final TruthTable table = model.getTable(); - if (table.getResultCount() > 4 && table.getVars().size() > 8) { - if (!allSolutionsDialog.isVisible()) - allSolutionsDialog.setVisible(true); - allSolutionsDialog.setText(Lang.get("msg_optimizationInProgress")); + if (table.getVars().size() >= 8) { + ExpressionCreator.ProgressListener progress = + table.getResultCount() == 1 ? null : + new ProgressDialog(this); + ExpressionListener finalExpressionListener = expressionListener; new Thread(() -> { ExpressionListenerStore storage = new ExpressionListenerStore(null); try { - new ExpressionCreator(table).create(storage); + new ExpressionCreator(table).setProgressListener(progress).create(storage); } catch (ExpressionException | FormatterException | AnalyseException e) { SwingUtilities.invokeLater(() -> { allSolutionsDialog.setVisible(false); From fcc5e8dfadb0dd4b617bc292244211344c335f19 Mon Sep 17 00:00:00 2001 From: hneemann Date: Wed, 3 Apr 2019 08:50:32 +0200 Subject: [PATCH 3/5] shows progress bar if optimization is running in a thread --- .../digital/gui/components/table/ProgressDialog.java | 6 ++++-- .../neemann/digital/gui/components/table/TableDialog.java | 5 ++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/neemann/digital/gui/components/table/ProgressDialog.java b/src/main/java/de/neemann/digital/gui/components/table/ProgressDialog.java index 9e970df0a..2104fbb4f 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/ProgressDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/table/ProgressDialog.java @@ -6,6 +6,7 @@ package de.neemann.digital.gui.components.table; import de.neemann.digital.lang.Lang; +import de.neemann.gui.Screen; import javax.swing.*; import java.awt.*; @@ -24,9 +25,10 @@ public class ProgressDialog extends JDialog implements ExpressionCreator.Progres setDefaultCloseOperation(DISPOSE_ON_CLOSE); bar = new JProgressBar(0, tableDialog.getModel().getTable().getResultCount()); - bar.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); + int b = Screen.getInstance().getFontSize(); + bar.setBorder(BorderFactory.createEmptyBorder(b,b,b,b)); final JLabel label = new JLabel(Lang.get("msg_optimizationInProgress")); - label.setBorder(BorderFactory.createEmptyBorder(5,5,0,5)); + label.setBorder(BorderFactory.createEmptyBorder(b,b,0,b)); getContentPane().add(label, BorderLayout.NORTH); getContentPane().add(bar, BorderLayout.SOUTH); diff --git a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java index 83effa8ac..9e5c8b284 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java @@ -600,9 +600,7 @@ public class TableDialog extends JDialog { final TruthTable table = model.getTable(); if (table.getVars().size() >= 8) { - ExpressionCreator.ProgressListener progress = - table.getResultCount() == 1 ? null : - new ProgressDialog(this); + ProgressDialog progress = new ProgressDialog(this); ExpressionListener finalExpressionListener = expressionListener; new Thread(() -> { @@ -611,6 +609,7 @@ public class TableDialog extends JDialog { new ExpressionCreator(table).setProgressListener(progress).create(storage); } catch (ExpressionException | FormatterException | AnalyseException e) { SwingUtilities.invokeLater(() -> { + progress.dispose(); allSolutionsDialog.setVisible(false); lastGeneratedExpressions = null; new ErrorMessage(Lang.get("msg_errorDuringCalculation")).addCause(e).show(this); From 010c4574a1996f7cd2bc07534cdc2c0c356ae816 Mon Sep 17 00:00:00 2001 From: hneemann Date: Wed, 3 Apr 2019 08:54:41 +0200 Subject: [PATCH 4/5] fixed some checkstyle issues --- .../gui/components/table/ExpressionCreator.java | 10 ++++++++-- .../digital/gui/components/table/ProgressDialog.java | 9 ++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java b/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java index 8f97e876b..20aa8f96b 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java +++ b/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java @@ -99,7 +99,7 @@ public class ExpressionCreator { listener.close(); time = System.currentTimeMillis() - time; LOGGER.debug("time: " + time / 1000.0 + " sec"); - if (progressListener!=null) + if (progressListener != null) progressListener.complete(); } @@ -130,6 +130,12 @@ public class ExpressionCreator { } } + /** + * Sets the progress listener to use + * + * @param progressListener the progress listener + * @return this for chained calls + */ public ExpressionCreator setProgressListener(ProgressListener progressListener) { this.progressListener = progressListener; return this; @@ -169,7 +175,7 @@ public class ExpressionCreator { long time = System.currentTimeMillis(); getMinimizer(localVars.size()).minimize(localVars, boolTable, resultName, listener); LOGGER.info("finished job with complexity " + getComplexity() + ": " + (System.currentTimeMillis() - time) / 1000 + "sec"); - if (progressListener!=null) + if (progressListener != null) progressListener.oneCompleted(); } diff --git a/src/main/java/de/neemann/digital/gui/components/table/ProgressDialog.java b/src/main/java/de/neemann/digital/gui/components/table/ProgressDialog.java index 2104fbb4f..957ba956c 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/ProgressDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/table/ProgressDialog.java @@ -11,6 +11,9 @@ import de.neemann.gui.Screen; import javax.swing.*; import java.awt.*; +/** + * A simple progress dialog which is used by the {@link ExpressionCreator} + */ public class ProgressDialog extends JDialog implements ExpressionCreator.ProgressListener { private final JProgressBar bar; private int prog; @@ -21,14 +24,14 @@ public class ProgressDialog extends JDialog implements ExpressionCreator.Progres * @param tableDialog the table dialog */ public ProgressDialog(TableDialog tableDialog) { - super(tableDialog,false); + super(tableDialog, false); setDefaultCloseOperation(DISPOSE_ON_CLOSE); bar = new JProgressBar(0, tableDialog.getModel().getTable().getResultCount()); int b = Screen.getInstance().getFontSize(); - bar.setBorder(BorderFactory.createEmptyBorder(b,b,b,b)); + bar.setBorder(BorderFactory.createEmptyBorder(b, b, b, b)); final JLabel label = new JLabel(Lang.get("msg_optimizationInProgress")); - label.setBorder(BorderFactory.createEmptyBorder(b,b,0,b)); + label.setBorder(BorderFactory.createEmptyBorder(b, b, 0, b)); getContentPane().add(label, BorderLayout.NORTH); getContentPane().add(bar, BorderLayout.SOUTH); From 318f261411208f0b3d77f394abf8cf3f869661a5 Mon Sep 17 00:00:00 2001 From: hneemann Date: Thu, 4 Apr 2019 14:54:41 +0200 Subject: [PATCH 5/5] removed unnecessary method call --- .../digital/gui/components/table/ExpressionCreator.java | 8 ++++---- .../neemann/digital/gui/components/table/TableDialog.java | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java b/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java index 20aa8f96b..4721e44d6 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java +++ b/src/main/java/de/neemann/digital/gui/components/table/ExpressionCreator.java @@ -56,7 +56,7 @@ public class ExpressionCreator { final List vars = Collections.unmodifiableList(theTable.getVars()); long time = System.currentTimeMillis(); if (theTable.getResultCount() >= 4 && vars.size() > COMPLEX_VAR_SIZE) { - LOGGER.info("use parallel solvers"); + LOGGER.debug("use parallel solvers"); ExecutorService ex = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); ArrayList jobs = new ArrayList<>(); @@ -66,7 +66,7 @@ public class ExpressionCreator { .setStorage(l)); } - LOGGER.info("jobs: " + jobs.size()); + LOGGER.debug("jobs: " + jobs.size()); ArrayList orderedJobs = new ArrayList<>(jobs); orderedJobs.sort(Comparator.comparingInt(job -> -job.getComplexity())); @@ -171,10 +171,10 @@ public class ExpressionCreator { } private void run() throws ExpressionException, FormatterException { - LOGGER.info("start job with complexity " + getComplexity()); + LOGGER.debug("start job with complexity " + getComplexity()); long time = System.currentTimeMillis(); getMinimizer(localVars.size()).minimize(localVars, boolTable, resultName, listener); - LOGGER.info("finished job with complexity " + getComplexity() + ": " + (System.currentTimeMillis() - time) / 1000 + "sec"); + LOGGER.debug("finished job with complexity " + getComplexity() + ": " + (System.currentTimeMillis() - time) / 1000 + "sec"); if (progressListener != null) progressListener.oneCompleted(); } diff --git a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java index 9e5c8b284..be8b91e7c 100644 --- a/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/table/TableDialog.java @@ -610,7 +610,6 @@ public class TableDialog extends JDialog { } catch (ExpressionException | FormatterException | AnalyseException e) { SwingUtilities.invokeLater(() -> { progress.dispose(); - allSolutionsDialog.setVisible(false); lastGeneratedExpressions = null; new ErrorMessage(Lang.get("msg_errorDuringCalculation")).addCause(e).show(this); });