繁体   English   中英

如何在eclipse插件中正确运行多个线程?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM