我正在编写一个Eclipse插件,旨在使Eclipse XML编辑器像Java编辑器一样运行。所需的功能之一是突出显示所选区域的所有出现(一个单词,一行,一个字符......)。只要您处理小文件,这样就可以了。
但是当我开始使用大文件(例如2000行代码)时,UI会在处理突出显示所需的时间内冻结。它仅仅是1秒或更短的时间,但它可能对用户非常刺激。那些"冻结"当我的听众被触发时发生,所以:
启动突出显示过程的当前代码如下:
try{
if (isValidContext(fText, input))
{
if (textSelection == null)
xmlH = new XMLHighlighter(fText, input);
else
xmlH = new XMLHighlighter(fText, input, textSelection);
Display.getDefault().asyncExec(new Runnable(){
@Override
public void run(){
try{
xmlH.highligth();
} catch (Exception e){
e.printStackTrace();
}
}
});
}
} catch (Exception e){
e.printStackTrace();
}
我认为运行新的Runnable会使此操作完全独立于UI中同时执行的其他操作。我错了吗?
这段代码是我认为造成滞后的原因。也许你会看到它吗?
感谢阅读。
答案 0 :(得分:3)
Display.asyncExec
尽快在 UI主题中运行Runnable
。当你已经在UI线程中时使用它在这种情况下并没有真正实现。
您必须使用后台线程,或Eclipse Job
,ProgressMonitorDialog
或IProgressService.run
甚至CompleteableFuture
来在后台运行长时间运行的代码。使用后台代码中的Display.asyncExec
更新用户界面。
另请注意,Eclipse文本编辑器支持代码提供了一个非常精细的系统,用于在后台进行语法突出显示等。查看SourceViewerConfiguration
,IPresentationReconciler
,IPartitionTokenScanner
,IPresentationDamager
,IPresentationRepairer
等内容。 Eclipse' New Plug-in Project'向导甚至会为您使用这些类创建XML编辑器的大纲。作为示例之一。