Странное поведение окна X11, открытого через ProcessBuilderJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Странное поведение окна X11, открытого через ProcessBuilder

Сообщение Anonymous »

Я использую Ubuntu 20.04 и Java SE 17. У меня есть Java-приложение, которое использует ProcessBuilder для запуска подпроцесса. Подпроцесс (выполняющий код R) запускает окно X11 и отображает в нем данные. В этом окне X11 наблюдается два странных поведения:
  • Оно нельзя закрыть с помощью мыши или сочетания клавиш (хотя его размер можно изменить).
  • При изменении размера график в нем пропадает.
Проблема исчезает, если тот же R-код запускается из терминала или как подпроцесс изнутри emacs. Поэтому я подозреваю, что проблема связана с тем, как я вызываю ProcessBuilder.
Соответствующие детали:

Код: Выделить всё

$ uname -a
Linux 1Latitude3420 5.15.0-86-generic #96~20.04.1-Ubuntu SMP Thu Sep 21 13:23:37 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
Версия Java:

Код: Выделить всё

$java -version
java -version
java version "17.0.1" 2021-10-19 LTS
Java(TM) SE Runtime Environment (build 17.0.1+12-LTS-39)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.1+12-LTS-39, mixed mode, sharing)
Как я вызываю ProcessBuilder:

Код: Выделить всё

ProcessBuilder pb = new ProcessBuilder("/usr/bin/R","--slave","-q","--save");
pb.redirectErrorStream(true);
Я запускаю команду R:

Код: Выделить всё

options(device=x11);  plot(1:9)
Я подозревал, что виновата среда отображения. Поэтому я напечатал это значение среды изнутри R, чтобы получить «:0», что соответствует тому, что я получаю от R, запущенного с терминала.
Буду очень признателен за любую помощь.
Арнаб.
PS: Этот пост SO выглядит похожим, но единственный (непринятый) ответ предлагает обновиться до Java 7 или более поздней версии. У меня уже есть Java 17.
----- Минимальный рабочий пример -----

Код: Выделить всё

import java.io.*;

public class RConn {

public static void main(String args[]) throws Exception {
OutputStream toR;
BufferedReader fromR;

PrintWriter sink;
Process p;
ProcessBuilder pb = new ProcessBuilder("/usr/bin/R","--slave","-q","--save");
pb.redirectErrorStream(true);
p = pb.start();

fromR = new BufferedReader(
new InputStreamReader(
p.getInputStream()
)
);

toR = p.getOutputStream();
if(toR!=null) {
System.err.println("Aha! Connected to R!");
}
else {
throw new Exception("Sorry, could not connect to R!");
}

toR.write(("options(device=x11); plot(1:9)\n").getBytes());
toR.flush();

while (true) {
String line = fromR.readLine();
}
}
}

Важное обновление
Если я добавлю Sys.sleep(20) в качестве последней строки в код R. Затем в течение этих 20 секунд размер окна можно будет правильно изменить (без исчезновения графика). Но плохое поведение возвращается через 20 секунд. Похоже, что бесконечный цикл в конце вызывает зависание. Но мне это нужно, чтобы не дать R умереть (и унести с собой окно x11).

Подробнее здесь: https://stackoverflow.com/questions/786 ... essbuilder
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»