interrupt work thread

This commit is contained in:
serso 2011-10-28 00:41:03 +04:00
parent ec55ccb1c6
commit cb5b4665cf
2 changed files with 38 additions and 22 deletions

View File

@ -78,6 +78,9 @@ public enum CalculatorEngine {
@NotNull @NotNull
private ThreadKiller threadKiller = new AndroidThreadKiller(); private ThreadKiller threadKiller = new AndroidThreadKiller();
// calculation thread timeout in milliseconds, after timeout thread would be interrupted
private int timeout = 2000;
@NotNull @NotNull
public String format(@NotNull Double value) { public String format(@NotNull Double value) {
return format(value, true); return format(value, true);
@ -191,7 +194,7 @@ public enum CalculatorEngine {
try { try {
//Log.d(CalculatorEngine.class.getName(), "Main thread is waiting: " + Thread.currentThread().getName()); //Log.d(CalculatorEngine.class.getName(), "Main thread is waiting: " + Thread.currentThread().getName());
latch.await(2, TimeUnit.SECONDS); latch.await(timeout, TimeUnit.MILLISECONDS);
//Log.d(CalculatorEngine.class.getName(), "Main thread got up: " + Thread.currentThread().getName()); //Log.d(CalculatorEngine.class.getName(), "Main thread got up: " + Thread.currentThread().getName());
final ParseException evalErrorLocal = exception.getObject(); final ParseException evalErrorLocal = exception.getObject();
@ -281,30 +284,35 @@ public enum CalculatorEngine {
return varsRegister; return varsRegister;
} }
// for tests
void setTimeout(int timeout) {
this.timeout = timeout;
}
/* private String commands(String str) { /* private String commands(String str) {
return commands(str, false); return commands(str, false);
}
private void exec(String str) throws EvalError {
interpreter.eval(str);
}
private String eval(String str) throws EvalError {
return interpreter.eval(commands(str)).toString();
}
private String commands(String str, boolean found) {
for (int i = 0; i < cmds.length; i++) {
int n = str.length() - cmds[i].length() - 1;
if (n >= 0 && (" " + cmds[i].toLowerCase()).equals(str.substring(n)))
return commands(str.substring(0, n), true) + "." + cmds[i] + "()";
} }
str = str.replaceAll("\n", "");
return found ? "jscl.math.Expression.valueOf(\"" + str + "\")" : str;
}
private static final String cmds[] = new String[]{"expand", "factorize", "elementary", "simplify", "numeric", "toMathML", "toJava"};*/
private void exec(String str) throws EvalError {
interpreter.eval(str);
}
private String eval(String str) throws EvalError {
return interpreter.eval(commands(str)).toString();
}
private String commands(String str, boolean found) {
for (int i = 0; i < cmds.length; i++) {
int n = str.length() - cmds[i].length() - 1;
if (n >= 0 && (" " + cmds[i].toLowerCase()).equals(str.substring(n)))
return commands(str.substring(0, n), true) + "." + cmds[i] + "()";
}
str = str.replaceAll("\n", "");
return found ? "jscl.math.Expression.valueOf(\"" + str + "\")" : str;
}
private static final String cmds[] = new String[]{"expand", "factorize", "elementary", "simplify", "numeric", "toMathML", "toJava"};*/
// for tests only // for tests only
void setThreadKiller(@NotNull ThreadKiller threadKiller) { void setThreadKiller(@NotNull ThreadKiller threadKiller) {

View File

@ -117,6 +117,14 @@ public class CalculatorEngineTest {
junit.framework.Assert.fail(); junit.framework.Assert.fail();
} }
} }
try {
cm.setTimeout(5000);
Assert.assertEquals("2", cm.evaluate(JsclOperation.numeric, "2!").getResult());
} finally {
cm.setTimeout(2000);
}
} }
@Test @Test