【问题标题】:Writing process input stream data to GUI将进程输入流数据写入 GUI
【发布时间】:2016-06-02 13:50:52
【问题描述】:

我在我的 GUI 的 java 代码中使用 SWT,并且我正在执行一个进程,他的代码是用 python 编写的。 我使用进程输入流来捕捉进程上的打印并将它们立即写入我的 GUI。

我的代码:

    in = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line;
    while ((line = in.readLine()) != null) {
        printToTerminal(line);
    }

和 printToTerminal 函数:

protected void printToTerminal(String text) {

        terminal.append(text + "\n");
        terminal.redraw();
        terminal.update();
    }

终端是一个文本对象,我想附加文本,然后使用重绘和更新,以便立即向用户显示该行。 我的问题是我的 GUI 被卡住了,因为 while 循环完成了这项工作并获取了线条,但我似乎无法在不卡住我的 GUI 的情况下获得获取线条的解决方案。 我尝试使用 display.async 函数并在其中包含 while 循环,但它仍然没有工作,我的 GUI 卡住了。

有没有办法为我的进程获取输入流并将其打印到我的 GUI 而不会卡住它?

感谢您的帮助。

【问题讨论】:

  • 为什么这个问题被标记为 Python?
  • 我错误地删除了标记

标签: java user-interface swt inputstream


【解决方案1】:

如果您在用户界面线程中运行长时间运行的代码,它将阻塞用户界面。所以你必须在后台运行这段代码。您可以使用Thread(或类似CompletableFuture)。如果这是一个 Eclipse 插件,您还可以使用Job 或进度监视器。

在您的后台线程中,您调用 Display.asyncExec 来运行更新 UI 的代码(因此只需在此处调用 printToTerminal)。

当代码已经在 UI 线程中运行时调用 Display.asyncExec 不起作用。

【讨论】:

  • 那么,如果您建议尝试将 printToTerminal 放在 Display.async 函数的 while 循环中?
  • 是的,您需要将读取文件的代码放在后台线程中。每次你有一行想要添加到 UI 时,你调用Display.asyncExec(或者Display.syncExec,如果你想等待它显示)。
猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多