Показать сообщение отдельно
Старый 31.01.2023, 14:49   #24  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Обнаружена еще одна интересная особенность работы с TreeNode.AOTmakeXref()
Оказывается в стандартном коде в большинстве мест этот метод обрамляется отключением записи собираемых перекрестных ссылок в постоянную таблицу, за счет чего ускоряется работа этого метода

Например так
\Classes\EditorScripts\documentation_HeaderTemplate
2012-я
X++:
        appl.updatexRefSet(true);
        memberFunction.aoTmakeXref(1);
        tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), memberFunction.treeNodePath());
        appl.updatexRefSet(false);
2009-я
X++:
        infolog.updatexRefSet(this, true);
        memberFunction.AOTmakeXref(1);
        tmpxRefReferences = xRefCreate::makeTmp(infolog.lastxRef(), memberFunction.treeNodePath());
        infolog.updatexRefSet(this, false);
А в популярных доработках к EditorScripts (открыть узел в AOT, перейти к определению переменной итп), в HK Framework итп, в общем, везде, где используются собираемые на лету перекрестные ссылки - этого не делается. Из-за этого в 12-ке бывает заметно подтормаживает и нервирует. Иногда замедление измеряется в секундах. Чаще меньше секунды но все равно напрягает.

Написал свой метод xRefCreate::makeTmpByTreeNode_MRC, который заменяет вызов
X++:
        appl.updatexRefSet(true);
        memberFunction.aoTmakeXref(1);
        tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), memberFunction.treeNodePath());
        appl.updatexRefSet(false);
и везде его использую

X++:
/// <summary>
/// Рекомендуется вместо treeNode.aotMakeXref(1); tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef());
/// </summary>
/// <param name="_treeNode">
/// TreeNode, для которого собираем временные перекрестные ссылки
/// </param>
/// <param name="_flag">
/// 1-й параметр _flag, передаваемый в treeNode.aotMakeXref(_flag)
/// </param>
/// <param name="_xRefAll">
/// 2-й параметр _xRefAll, передаваемый в treeNode.aotMakeXref(_flag, _xRefAll)
/// </param>
/// <param name="_path">
/// параметр _path передаваемый в xRefCreate::makeTmp()
/// </param>
/// <returns>
/// Временная таблица xRefTmpReferences с результатами сбора перекрестных ссылок по treenode
/// </returns>
/// <remarks>
/// [url=http://axforum.info/forums/showthread.php?p=299419#post299419]Открыть в новом окне объект из кода[/url]
/// В 2012-й вызов treeNode.aotMakeXref(1) работает быстрее если 
/// обрамить его отключением сохранения перекрестных ссылок
/// см. пример в стандартном коде в \Classes\EditorScripts\documentation_HeaderTemplate
/// 
/// метод makeTmpByTreeNode_MRC сделан для удобства, для замены куска кода 
///         appl.updatexRefSet(true);
///         treeNode.aotMakeXref(1);
///         tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), treeNode.treeNodePath());
///         appl.updatexRefSet(false);
/// одной строкой кода с вызовом этого метода
///         xRefCreate::makeTmpByTreeNode_MRC(treeNode, 1, false /*default value*/, treeNode.treeNodePath());
/// </remarks>

// JEV007437, PKoz 31.01.2023

public static xRefTmpReferences makeTmpByTreeNode_MRC(
    TreeNode    _treeNode,
    int         _flag    = 1, // обычно 1
    boolean     _xRefAll = false,
    xRefPath    _path    = '' // в стандарте обычно _treeNode.treeNodePath()
    )
{
    xRefTmpReferences   tmpxRefReferences;
    boolean             temporaryForbidSaveXref;
    ;

    temporaryForbidSaveXref = appl.canUpdatexRef();
    if (temporaryForbidSaveXref)
    {
        appl.updatexRefSet(true);
    }

    _treeNode.aotMakeXref(_flag, _xRefAll);
    tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef(), _path);

    if (temporaryForbidSaveXref)
    {
        appl.updatexRefSet(false);
    }

    return tmpxRefReferences;
}
За это сообщение автора поблагодарили: demianimp (4), gl00mie (10).