Question

I have a programm which communicates with MPlayer through Input and Outputstream of the Process. It works quite good, but I can only communicate with the Process in the Main Thread, and not in any other. Is there a posibility to get arround that?

synchronized-Methods or blocks didn't brought a solution

private String getProperty(String property) {
    System.out.println("CurThread: " + Thread.currentThread().getName());
    String cmd = "";
    cmd = String.format("pausing_keep_force get_property %s", property);
    mplayerIn.println(cmd);
    mplayerIn.flush();
    String rightAnswer = String.format("ANS_%s=", property);
    String errorAnswer = "ANS_ERROR";
    String answer;
    String value = "";
    try {
        while ((answer = mplayerOut.readLine()) != null) {
            if (answer.startsWith(rightAnswer)) {
                value = answer.substring(rightAnswer.length());
                break;
            }
            if (answer.startsWith(errorAnswer)) {
                value = "";
                break;
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("Property Error:" + property);
    }
    return value;

}

edit: ProcessCommunicator

public class ProcessCommunicator extends Thread {
private String cmd;
private BufferedReader is;
private PrintStream os;
List<MessageReceivedListener> listeners;

public boolean addListener(MessageReceivedListener listener) {
    return listeners.add(listener);
}

public boolean removeListener(MessageReceivedListener listener) {
    if (listeners.contains(listener)) {
        return listeners.remove(listener);
    }
    return false;
}

public ProcessCommunicator(String cmd) {
    this.cmd = cmd;
    listeners = new ArrayList<>();
}

public void write(String cmd) {
    System.out.println(cmd);
    os.println(cmd);
    os.flush();
}

public void fireEvent(String msg) {
    for (MessageReceivedListener listener : listeners) {
        listener.received(msg);
    }
}
Process p;
@Override
public void run() {
    try {
        p = Runtime.getRuntime().exec(cmd);
        is = new BufferedReader(new InputStreamReader(p.getInputStream()));
        os = new PrintStream(p.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
    String line;
    try {
        while ((line = is.readLine()) != null) {
            System.err.println(line);
            fireEvent(line.trim());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

boolean waitForProperty;
String propertyResult;

public String readProperty(String property) {
    final String rightAnswer = String.format("ANS_%s=", property);
    propertyResult = "";
    MessageReceivedListener messageListener = new MessageReceivedListener() {
        @Override
        public void received(String s) {
            if (s.startsWith(rightAnswer)) {
                waitForProperty = false;
                propertyResult = s.substring(rightAnswer.length());
            } else if (s.startsWith("ANS_ERROR")) {
                waitForProperty = false;
                propertyResult = "";
            }
        }
    };
    addListener(messageListener);
    waitForProperty = true;
    write(String.format("pausing_keep_force get_property %s", property));

    int i = 5;
    while (waitForProperty && i > 0) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.print(".");
        i--;
    }
    System.out.println("END");

    removeListener(messageListener);
    return propertyResult;
}
}

No correct solution

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top