Hallo zusammen.
Ich bekommen bei meiner Java Anwendung regelmässig einen BlueScreen, sobald ich auf einen bestimmten Button auf menem GUI clicke.
Wenn ich auf den Button cklicke wird ein neuer Task zu meinem TaskPool hinzugefügt, und ausgeführt.
Das Programm, wird jedoch richtig gestartet, wenn es genügend Zeit vor dem BlueScreen hat.
Bei Click auf den Button wird folgendes ausgeführt:
Der RunTask sieht folgendermassen aus:
Und schliesslich noch der Task Pool, der den Task ausführen soll:
Zudem bräuchte ich noch eine Lösung für die Schleife
etwas wie
Ich bekommen bei meiner Java Anwendung regelmässig einen BlueScreen, sobald ich auf einen bestimmten Button auf menem GUI clicke.
Wenn ich auf den Button cklicke wird ein neuer Task zu meinem TaskPool hinzugefügt, und ausgeführt.
Das Programm, wird jedoch richtig gestartet, wenn es genügend Zeit vor dem BlueScreen hat.
Bei Click auf den Button wird folgendes ausgeführt:
Java:
TaskPool.getInstance().addTask(new Run("C:\\Program Files\\PSPad editor\\PSPad.exe"));
Der RunTask sieht folgendermassen aus:
Java:
package ch.forthedit.tasks;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import ch.forthedit.gui.ide.OutputPane;
import ch.forthedit.gui.ide.ToolPane;
import ch.forthedit.project.Project;
/**
*
* @author tim
*/
public class Run implements Task {
protected String[] args;
public Run(String executable, String... args) {
if (args != null) {
this.args = new String[args.length + 1];
this.args[0] = executable;
System.arraycopy(args, 0, this.args, 1, args.length);
}
}
@Override
public void run() {
Process pr = null;
try {
pr = startProcess();
} catch (IOException e) {
LOGGER.warn(String.format("Failed to start %s", args[0]), e);
getOutputPane().append(
String.format("Failed to start %s%n", args[0]));
return;
}
OutputStream stdin = pr.getOutputStream();
InputStream stderr = pr.getErrorStream();
InputStream stdout = pr.getInputStream();
try {
StringBuilder builder = new StringBuilder();
byte[] buffer = new byte[100];
while (!Thread.interrupted()) {
while (stderr.available() > 0) {
int i = stderr.read(buffer);
builder.append(new String(buffer, 0, i));
}
while (stdout.available() > 0) {
int i = stderr.read(buffer);
builder.append(new String(buffer, 0, i));
}
getOutputPane().append(builder.toString());
if (builder.length() < 0)
builder.delete(0, builder.length() - 1);
}
} catch (IOException ex) {
getOutputPane().append("Unknown error occured.");
}
}
@Override
public void finished() {
getOutputPane().append("Finished\n");
}
protected Process startProcess() throws IOException {
File dir = null;
if (Project.getActualProject() != null)
dir = Project.getActualProject().getProjectDir();
if (dir == null) {
return Runtime.getRuntime().exec(args);
} else {
return Runtime.getRuntime().exec(args, null,
Project.getActualProject().getProjectDir());
}
}
protected OutputPane getOutputPane() {
return ToolPane.getInstance().getOutput();
}
}
Und schliesslich noch der Task Pool, der den Task ausführen soll:
Java:
package ch.forthedit.tasks;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
*
* @author Tim
*
*/
public class TaskPool extends Thread {
/** The singleton instance */
private static final TaskPool INSTANCE = new TaskPool();
private final BlockingQueue<Task> tasks;
/** The private constructor */
private TaskPool() {
super("TaskPool");
tasks = new LinkedBlockingQueue<>();
}
/** Returns the singleton instance */
public static TaskPool getInstance() {
return INSTANCE;
}
public synchronized void addTask(Task t) {
tasks.add(t);
this.notifyAll();
}
@Override
public void run() {
super.run();
while (!isInterrupted()) {
Task t = tasks.peek();
if (t == null) {
try {
synchronized (this) {
this.wait();
}
} catch (InterruptedException e) {
break;
}
} else {
t.run();
t.finished();
}
}
}
}
Zudem bräuchte ich noch eine Lösung für die Schleife
Code:
while(!Thread.interrupted())
Code:
while(!process.finished())