Fixed a potential dead lock for external programs that write to stderr
Added an option to state a working directory for the external runtime
This commit is contained in:
parent
7c5363cae8
commit
475e488b27
@ -1,11 +1,19 @@
|
|||||||
package javaeva.server.go.problems;
|
package javaeva.server.go.problems;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.Reader;
|
||||||
|
import java.io.Writer;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import javaeva.gui.BeanInspector;
|
import javaeva.gui.BeanInspector;
|
||||||
import javaeva.server.go.individuals.AbstractEAIndividual;
|
import javaeva.server.go.individuals.AbstractEAIndividual;
|
||||||
import javaeva.server.go.individuals.ESIndividualDoubleData;
|
import javaeva.server.go.individuals.ESIndividualDoubleData;
|
||||||
@ -19,9 +27,34 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen
|
|||||||
protected int m_ProblemDimension = 10;
|
protected int m_ProblemDimension = 10;
|
||||||
// protected boolean m_UseTestConstraint = false;
|
// protected boolean m_UseTestConstraint = false;
|
||||||
protected String m_Command = "";
|
protected String m_Command = "";
|
||||||
|
protected String m_WorkingDir = "";
|
||||||
protected double m_upperBound = 10;
|
protected double m_upperBound = 10;
|
||||||
protected double m_lowerBound = 0;
|
protected double m_lowerBound = 0;
|
||||||
|
|
||||||
|
// Private Subclass to redirect Streams within an extra Thread to avoid dead
|
||||||
|
// locks
|
||||||
|
private static class MonitorInputStreamThread extends Thread {
|
||||||
|
private Reader reader;
|
||||||
|
private Writer writer;
|
||||||
|
|
||||||
|
public MonitorInputStreamThread(InputStream in) {
|
||||||
|
reader = new InputStreamReader(new BufferedInputStream(in));
|
||||||
|
writer = new OutputStreamWriter(System.err);
|
||||||
|
setDaemon(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
int c;
|
||||||
|
while ((c = reader.read()) != -1) {
|
||||||
|
writer.write(c);
|
||||||
|
writer.flush();
|
||||||
|
}
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
ioe.printStackTrace(System.err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ExternalRuntimeProblem() {
|
public ExternalRuntimeProblem() {
|
||||||
this.m_Template = new ESIndividualDoubleData();
|
this.m_Template = new ESIndividualDoubleData();
|
||||||
@ -134,8 +167,11 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen
|
|||||||
parameters.add(new String(""+x[i]));
|
parameters.add(new String(""+x[i]));
|
||||||
}
|
}
|
||||||
pb = new ProcessBuilder(parameters);
|
pb = new ProcessBuilder(parameters);
|
||||||
|
pb.directory(new File(this.m_WorkingDir));
|
||||||
process=pb.start();
|
process=pb.start();
|
||||||
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
|
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
|
||||||
|
Thread thread = new MonitorInputStreamThread(process.getErrorStream());//grab the Error Stream
|
||||||
|
thread.start();
|
||||||
String line;
|
String line;
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
line = line.trim();
|
line = line.trim();
|
||||||
@ -221,6 +257,19 @@ public class ExternalRuntimeProblem extends AbstractOptimizationProblem implemen
|
|||||||
return "Command";
|
return "Command";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Working dir of the external runtime
|
||||||
|
* @param t working directory
|
||||||
|
*/
|
||||||
|
public void setWorkingDirectory(String t) {
|
||||||
|
this.m_WorkingDir = t;
|
||||||
|
}
|
||||||
|
public String getWorkingDirectory() {
|
||||||
|
return this.m_WorkingDir;
|
||||||
|
}
|
||||||
|
public String workingDirectoryTipText() {
|
||||||
|
return "Working directory";
|
||||||
|
}
|
||||||
|
|
||||||
// /** This method allows you to toggle the application of a simple test constraint.
|
// /** This method allows you to toggle the application of a simple test constraint.
|
||||||
// * @param b The mode for the test constraint
|
// * @param b The mode for the test constraint
|
||||||
// */
|
// */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user