Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Eclipse插件开发,长期运行任务_Eclipse_Plugins_Asynchronous_Code Injection - Fatal编程技术网

Eclipse插件开发,长期运行任务

Eclipse插件开发,长期运行任务,eclipse,plugins,asynchronous,code-injection,Eclipse,Plugins,Asynchronous,Code Injection,我有几个具有侦听器的UI组件。所有这些侦听器都调用方法dialogChanged()。我的目标是用这种方法进行一些长时间的处理,不要让UI冻结。据介绍,在运行时注入的ui同步的帮助下,可以做到这一点。但它对我来说失败了,这种类型的字段没有被注入,我得到了一个NullPointerException。以下是我代码的相关部分: @Inject UISynchronize sync; Job job = new Job("My Job") { @Override

我有几个具有侦听器的UI组件。所有这些侦听器都调用方法
dialogChanged()
。我的目标是用这种方法进行一些长时间的处理,不要让UI冻结。据介绍,在运行时注入的
ui同步
的帮助下,可以做到这一点。但它对我来说失败了,这种类型的字段没有被注入,我得到了一个
NullPointerException
。以下是我代码的相关部分:

@Inject UISynchronize sync;
Job job = new Job("My Job") {

    @Override
    protected IStatus run(IProgressMonitor arg0)
    {
        sync.asyncExec(new Runnable()
        {
            @Override
            public void run()
            {
                updateStatus("Checking connection...");
                if (bisInstallDirSelected)
                    bisSettingsChanged();
                else
                    jarSettingsChanged();
            }
        });
        return Status.OK_STATUS;
    }

};
protected void dialogChanged()
{
    job.schedule();
}
方法
updateStatus(String s)
bisSettingsChanged()
jarsetingschanged()
与UI交互,具体来说,它们使用超类
org.eclipse.jface.wizard.WizardPage的方法
setErrorMessage(String newMessage)

如果有人能告诉我我做错了什么,或者提出更好的方法来处理这个问题,我将不胜感激。

您只能在e4应用程序模型创建的类中使用@Inject(例如部件类或命令处理程序类)

您还可以使用
ContextInjectionFactory
对自己的类进行注入

对于尚未完成注入的类,可以使用在UI线程中运行代码的“传统”方式:

Display.getDefault().asyncExec(可运行);

包含此代码的类是什么@Inject仅在应用程序模型知道的类(例如MPart的类)中工作。该类间接扩展了
org.eclipse.jface.wizard.WizardPage
,并且没有其他依赖项。我已经尝试使用
getShell().getDisplay().asyncExec()
,但在执行
dialogChanged()时UI冻结
。这同样适用于您对静态方法的建议。我还使用
Thread.currentMethod()
将运行runnable的线程与调用
dialogChanged()
的线程进行了比较,结果发现它是同一个线程(
main
)。它解释了UI冻结的原因,但我希望'asyncExec()'将处理交换到外部线程。等等。。。我想我理解我的错误:)我需要以某种方式将阻止处理的代码与与与UI交互的代码分开。。。