我在我的java代码中使用SWT作为我的GUI,我正在执行一个他的代码是用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();
}
终端是一个Text对象,我想附加文本,然后使用重绘和更新,以便立即向用户显示该行。 我的问题是我的GUI被卡住了因为那个循环,它做了工作并得到了线但我似乎无法获得解决方案获得线条而不会卡住我的GUI。 我尝试使用display.async函数并在那里包含while循环,但它仍然没有用,我的GUI被卡住了。
有没有办法为我的流程获取输入流并将其打印到我的GUI而不会卡住它?
感谢您的帮助。
答案 0 :(得分:2)
如果在用户界面线程中运行长时间运行的代码,它将阻止UI。因此,您必须在后台运行此代码。您可以使用Thread
(或CompletableFuture
之类的内容)。如果这是一个Eclipse插件,您还可以使用Job
或进度监视器。
在后台主题中,您调用Display.asyncExec
来运行更新UI的代码(这里只需要调用printToTerminal
)。
当代码已经在UI线程中运行时调用Display.asyncExec
不起作用。