0

タイトルで説明したように、IResourceChangeEvents をバッチ処理するアプローチを使用して IMarkers を作成しようとしています。私の目標は、正しく安定した方法で IMarker を作成することです。(変更イベントをバッチ処理する目的で) IWorkspaceRunnable の使用に制限はありますか?それとも、現在のスレッドで IMarkers を作成する方が安全ですか? 同時実行性の問題など、予測可能なエラーはありますか?

これは少し自由回答の質問ですが、IWorkspaceRunnable を使用して IMarkers を作成することの長所と短所を理解したいだけです。以下は、バッチの変更がある場合とない場合のコード例です。

// Generates marker with the given attributes
public static IMarker generateMarker(final IFile file, final Map<String, Object>     attributes,
                                   final String markerType) throws CoreException, BadLocationException, IOException
{
    if (!attributes.containsKey(IMarker.LINE_NUMBER))
    {
        // Assumes that attributes has a mapping for IMarker.CHAR_START, which is invariant when creating markers in Solstice
        int line = ResourceUtility.convertToDocument(file).getLineOfOffset((int) attributes.get(IMarker.CHAR_START));
        attributes.put(IMarker.LINE_NUMBER, line + 1); // lines indexed at 1, not 0
    }

    IWorkspaceRunnable r = new IWorkspaceRunnable()
    {
        public void run(@Nullable IProgressMonitor monitor) throws CoreException
        {
            IMarker marker = file.createMarker(markerType);
            marker.setAttributes(attributes);

            MarkerField.marker_ = marker; // MarkerField is just an inner class. Functions as a pointer to a pointer.
        }
    };
    file.getWorkspace().run(r, ResourceUtility.getRuleFactory().markerRule(file), 0, null);
    return MarkerField.marker_;
}

別の方法として、バッチ メカニズムを削除して、次のコードを使用することもできます。

// Generates marker with the given attributes
public static IMarker generateMarker(final IFile file, final Map<String, Object>     attributes,
                                   final String markerType) throws CoreException, BadLocationException, IOException
{
    if (!attributes.containsKey(IMarker.LINE_NUMBER))
    {
        // Assumes that attributes has a mapping for IMarker.CHAR_START, which is invariant when creating markers in Solstice
        int line = ResourceUtility.convertToDocument(file).getLineOfOffset((int) attributes.get(IMarker.CHAR_START));
        attributes.put(IMarker.LINE_NUMBER, line + 1); // lines indexed at 1, not 0
    }

    IMarker marker = file.createMarker(markerType);
    marker.setAttributes(attributes);

    return marker;
}

各方法の長所/短所は何ですか?

4

1 に答える 1