diff --git a/openchemlib-hyperspace-core-gui2/src/main/java/com/idorsia/research/chem/hyperspace/gui2/model/RealTimeExpandingSearchResultModel.java b/openchemlib-hyperspace-core-gui2/src/main/java/com/idorsia/research/chem/hyperspace/gui2/model/RealTimeExpandingSearchResultModel.java index d02cafc..22e7d46 100644 --- a/openchemlib-hyperspace-core-gui2/src/main/java/com/idorsia/research/chem/hyperspace/gui2/model/RealTimeExpandingSearchResultModel.java +++ b/openchemlib-hyperspace-core-gui2/src/main/java/com/idorsia/research/chem/hyperspace/gui2/model/RealTimeExpandingSearchResultModel.java @@ -15,10 +15,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.*; public class RealTimeExpandingSearchResultModel { @@ -58,6 +55,8 @@ private RealTimeExpandingSearchResultModel getThis() { return this; } + private final List expansionTasks = Collections.synchronizedList(new ArrayList<>()); + private void processResultsChanged() { // we may end up here from edt.. therefore do this // async.. @@ -83,6 +82,7 @@ public void run() { if(moleculeOrder.size()>maxExpandedHits) {return;} List processed = new ArrayList<>(); for(SynthonAssembler.ExpandedCombinatorialHit xi : exp_hits) { + if(Thread.interrupted()) {break;} String processed_idcode = processResultStructure(xi.assembled_idcode); assembledMolecules.put(processed_idcode,fchi); processed.add(processed_idcode); @@ -115,7 +115,10 @@ public void run() { if(getThis().expansionThreadPool==null || getThis().expansionThreadPool.isShutdown() ) { getThis().restartThreadpool(); } - expansionThreadPool.submit(ri); + Future fExp = expansionThreadPool.submit(ri); + synchronized(expansionTasks) { + expansionTasks.add(fExp); + } } //ri.setPriority(Thread.MIN_PRIORITY); //ri.start(); @@ -132,6 +135,17 @@ public void run() { private ThreadPoolExecutor expansionThreadPool; private void initExpansionThreadPool() { + if(!expansionTasks.isEmpty()) { + List allTasks = new ArrayList<>(); + synchronized(expansionTasks) { + allTasks = new ArrayList<>(expansionTasks); + } + for(Future fi : allTasks) { + fi.cancel(true); + expansionTasks.remove(fi); + } + } + expansionThreadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(2); // Set the lowest priority for each thread @@ -277,6 +291,13 @@ public Object getValueAt(int rowIndex, int columnIndex) { } public void shutdownThreadpool() { + if(!expansionTasks.isEmpty()) { + List allTasks = new ArrayList<>(expansionTasks); + for(Future fi : allTasks) { + fi.cancel(true); + expansionTasks.remove(fi); + } + } this.expansionThreadPool.shutdown(); } diff --git a/openchemlib-hyperspace-core-gui2/src/main/java/com/idorsia/research/chem/hyperspace/gui2/view/RealTimeExpandingHitsView.java b/openchemlib-hyperspace-core-gui2/src/main/java/com/idorsia/research/chem/hyperspace/gui2/view/RealTimeExpandingHitsView.java index 0c0a801..12043a0 100644 --- a/openchemlib-hyperspace-core-gui2/src/main/java/com/idorsia/research/chem/hyperspace/gui2/view/RealTimeExpandingHitsView.java +++ b/openchemlib-hyperspace-core-gui2/src/main/java/com/idorsia/research/chem/hyperspace/gui2/view/RealTimeExpandingHitsView.java @@ -133,6 +133,7 @@ public void run() { }); } this.initMouseContextMenu(); + SwingUtilities.updateComponentTreeUI(this); } public JPanel getPanelTopRight() { diff --git a/openchemlib-hyperspace-core/src/main/java/com/idorsia/research/chem/hyperspace/SynthonAssembler.java b/openchemlib-hyperspace-core/src/main/java/com/idorsia/research/chem/hyperspace/SynthonAssembler.java index 10f7e49..d863a0b 100644 --- a/openchemlib-hyperspace-core/src/main/java/com/idorsia/research/chem/hyperspace/SynthonAssembler.java +++ b/openchemlib-hyperspace-core/src/main/java/com/idorsia/research/chem/hyperspace/SynthonAssembler.java @@ -306,6 +306,7 @@ public static List expandCombinatorialHit(SynthonSpace current_assemblies.add(new ArrayList<>()); for(int zi=0;zi();} List> next_assemblies = new ArrayList<>(); for( List ca : current_assemblies) { if(next_assemblies.size()>=max_expanded) {break;} @@ -324,6 +325,8 @@ public static List expandCombinatorialHit(SynthonSpace List results = new ArrayList<>(); IDCodeParser icp = new IDCodeParser(); for(List api : current_assemblies) { + if(Thread.interrupted()) {return results;} + List parts = new ArrayList<>(); List parts_ids = new ArrayList<>(); for( SynthonSpace.FragId fid : api ) { diff --git a/pom.xml b/pom.xml index 285975e..c29338e 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,7 @@ - 2.1.28-SNAPSHOT + 2.1.35-SNAPSHOT