[英]How to run multiple thread properly in eclipse plugin?
我的插件检查用户是否空闲了一段时间。 通过这里的解决方案,我试着解决这个问题。 但是,在循环结束之前,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代码,因此您根本无法在后台线程中运行此代码。
所以你不能像你所展示的那样使用循环。 您必须跟踪密钥监听器中的内容,每次调用监听器时都要更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.