如何在 eclipse 插件中正确 运行 多线程?
How to run multiple thread properly in eclipse plugin?
我的插件会检查用户是否闲置了一段时间。使用 here 的解决方案,我尝试解决问题。但是在循环结束之前,eclipse 应用程序变得没有响应。
此外,消息框只是一个没有标题和按钮的普通框。有人可以告诉我这段代码有什么问题吗?
@Override
public void earlyStartup() {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
//while(true) {
for (stop=System.nanoTime()+TimeUnit.MINUTES.toNanos(1);stop>System.nanoTime();) {
Display.getDefault().addFilter(SWT.KeyUp, new Listener() {
@Override
public void handleEvent(Event event) {
stop=System.nanoTime()+TimeUnit.MINUTES.toNanos(1);
System.out.println("checkpoint 1");
}
});
}
Shell shell = new Shell(Display.getDefault());
MessageBox dialog =
new MessageBox(shell, SWT.ICON_INFORMATION | SWT.OK);
dialog.setText("Alert!");
dialog.setMessage("You have been idle for the last 3 minutes.");
shell.open();
stop=System.nanoTime()+TimeUnit.MINUTES.toNanos(1);
System.out.println("checkpoint 2");
}
});
}
Display.asyncExec
而不是 运行 在单独的线程中执行代码。它 运行 主 UI 线程中的代码一可用。 UI 线程将被阻塞,直到代码结束。
相反,您可以 运行 在普通 Java 线程中编写代码。但是您必须调用 asyncExec
来执行您想要从线程 运行 执行的任何 UI 代码。
在您的实际代码中,您应该只调用 Display.addFilter
一次。这将添加一个侦听器,从那时起每次发生按键事件时都会调用该侦听器。由于这是 UI 代码,您根本无法 运行 在后台线程中执行此操作。
所以你不能像你展示的那样使用循环。您必须跟踪关键侦听器中的内容,每次调用侦听器时更新。
我的插件会检查用户是否闲置了一段时间。使用 here 的解决方案,我尝试解决问题。但是在循环结束之前,eclipse 应用程序变得没有响应。
此外,消息框只是一个没有标题和按钮的普通框。有人可以告诉我这段代码有什么问题吗?
@Override
public void earlyStartup() {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
//while(true) {
for (stop=System.nanoTime()+TimeUnit.MINUTES.toNanos(1);stop>System.nanoTime();) {
Display.getDefault().addFilter(SWT.KeyUp, new Listener() {
@Override
public void handleEvent(Event event) {
stop=System.nanoTime()+TimeUnit.MINUTES.toNanos(1);
System.out.println("checkpoint 1");
}
});
}
Shell shell = new Shell(Display.getDefault());
MessageBox dialog =
new MessageBox(shell, SWT.ICON_INFORMATION | SWT.OK);
dialog.setText("Alert!");
dialog.setMessage("You have been idle for the last 3 minutes.");
shell.open();
stop=System.nanoTime()+TimeUnit.MINUTES.toNanos(1);
System.out.println("checkpoint 2");
}
});
}
Display.asyncExec
而不是 运行 在单独的线程中执行代码。它 运行 主 UI 线程中的代码一可用。 UI 线程将被阻塞,直到代码结束。
相反,您可以 运行 在普通 Java 线程中编写代码。但是您必须调用 asyncExec
来执行您想要从线程 运行 执行的任何 UI 代码。
在您的实际代码中,您应该只调用 Display.addFilter
一次。这将添加一个侦听器,从那时起每次发生按键事件时都会调用该侦听器。由于这是 UI 代码,您根本无法 运行 在后台线程中执行此操作。
所以你不能像你展示的那样使用循环。您必须跟踪关键侦听器中的内容,每次调用侦听器时更新。