Почему вставка иногда выполняется на 200мс дольше?

tormozit Закрыто Высокий

Родственная заявка https://turboconf.ru/Tasks/9889

RyD1sjlc2E.mp4
Ссылка скрыта

Комментарии

tormozit
#1, 24 декабря 2025 23:25

Похоже это дополнительное время уходит на перемещение каретки, вызванное наличием в шаблоне маркеров <!>/<?>.


tormozit
#2, ред. 24 декабря 2025 23:43

Вот лог вставки шаблона "Сообщить(<!>);". Кажется слишком долгим выполнять после вставки смешение каретки а 2 позиции правее за 200мс (сравнивал со вставкой шаблона "Сообщить();").

[24.12.25 22:56:31:615] Замер: Paste time: 115ms
[24.12.25 22:56:31:615] Set AllowMouseEvents = False
[24.12.25 22:56:31:615] Set PasteForm.IsVisible = False
[24.12.25 22:56:31:616] Set ClipCursorPosition =
[24.12.25 22:56:31:616] OnKeyDown Right
[24.12.25 22:56:31:616] Clear _TurboApiSingletone.Instance.LastKeyEventArgs (TurboApi.IsProcess = true)
[24.12.25 22:56:31:616] Received await = Right IsProcess=True, IsQueueInProgress=False, (143,0005 ms) fg=280a06 title=[КА1 серверная] - Общий модуль ирОбщий: Модуль - Конфигуратор - КомплекснаяАвтоматизация, KeyData=Right
[24.12.25 22:56:31:616] KeyboardHookManagerOnKeyUp(): Right
[24.12.25 22:56:31:617] Received await = Right IsProcess=True, IsQueueInProgress=False, (1,0001 ms) fg=280a06 title=[КА1 серверная] - Общий модуль ирОбщий: Модуль - Конфигуратор - КомплекснаяАвтоматизация, KeyData=Right
[24.12.25 22:56:31:617] Paste time: 122ms
[24.12.25 22:56:31:631] 13ms
[24.12.25 22:56:31:631] IsPatternSupported(30040): True
[24.12.25 22:56:31:632] GetText6()... title=[КА1 серверная] - Общий модуль ирОбщий: Модуль - Конфигуратор - КомплекснаяАвтоматизация,curFg=2624006,fg=2624006
[24.12.25 22:56:31:632] GetUIAutomationInfo()... title=[КА1 серверная] - Общий модуль ирОбщий: Модуль - Конфигуратор - КомплекснаяАвтоматизация,curFg=2624006,fg=2624006
[24.12.25 22:56:31:632] GetUIAutomationCachedInfo()... title=[КА1 серверная] - Общий модуль ирОбщий: Модуль - Конфигуратор - КомплекснаяАвтоматизация,curFg=2624006,fg=2624006
[24.12.25 22:56:31:632] CurrentDocumentRuntimeId=
[24.12.25 22:56:31:639] curFg=[КА1 серверная] - Общий модуль ирОбщий: Модуль - Конфигуратор - КомплекснаяАвтоматизация, curFg=2624006
[24.12.25 22:56:31:639] controlType: документ
[24.12.25 22:56:31:639] name:
[24.12.25 22:56:31:649] text.Length=1472565
[24.12.25 22:56:31:649] selectedRange.Length=1
[24.12.25 22:56:31:661] result.CurrentRangeText.Length=918585
[24.12.25 22:56:31:661] result.Position=918585
[24.12.25 22:56:31:661] doc.Position = 918585
[24.12.25 22:56:31:661] CurrentDocumentRuntimeId=42 2624006 4 545334844
[24.12.25 22:56:31:661] Set LastDocument for pid=45452 42 2624006 4 545334844
[24.12.25 22:56:31:661] Set SetLastElement for wnd=2624006
[24.12.25 22:56:31:661] GetUIAutomationCachedInfo() 29ms, total calls 26
[24.12.25 22:56:31:661] T9CurrentControlType=документ
[24.12.25 22:56:31:703] Select time overall: 35ms
[24.12.25 22:56:31:703] GetUIAutomationInfoAsync()... title=[КА1 серверная] - Общий модуль ирОбщий: Модуль - Конфигуратор - КомплекснаяАвтоматизация,curFg=2624006,fg=2624006
[24.12.25 22:56:31:703] GetUIAutomationCachedInfoAsync()... title=[КА1 серверная] - Общий модуль ирОбщий: Модуль - Конфигуратор - КомплекснаяАвтоматизация,curFg=2624006,fg=2624006
[24.12.25 22:56:31:704] GetUIAutomationCachedInfo()... title=[КА1 серверная] - Общий модуль ирОбщий: Модуль - Конфигуратор - КомплекснаяАвтоматизация,curFg=2624006,fg=2624006
[24.12.25 22:56:31:704] CurrentDocumentRuntimeId=
[24.12.25 22:56:31:713] curFg=[КА1 серверная] - Общий модуль ирОбщий: Модуль - Конфигуратор - КомплекснаяАвтоматизация, curFg=2624006
[24.12.25 22:56:31:713] controlType: документ
[24.12.25 22:56:31:713] name:
[24.12.25 22:56:31:725] text.Length=1472565
[24.12.25 22:56:31:725] selectedRange.Length=1
[24.12.25 22:56:31:735] result.CurrentRangeText.Length=918583
[24.12.25 22:56:31:735] result.Position=918583
[24.12.25 22:56:31:735] doc.Position = 918583
[24.12.25 22:56:31:735] CurrentDocumentRuntimeId=42 2624006 4 545334844
[24.12.25 22:56:31:735] Set LastDocument for pid=45452 42 2624006 4 545334844
[24.12.25 22:56:31:735] Set SetLastElement for wnd=2624006
[24.12.25 22:56:31:735] GetUIAutomationCachedInfo() 31ms, total calls 27
[24.12.25 22:56:31:747] Goto position time: 129ms
[24.12.25 22:56:31:747] Move cursor to location time: 0ms
[24.12.25 22:56:31:749] Запускаем обработчик ПослеВставкиЗначенияТ9 в скрипте ...
[24.12.25 22:56:31:749] ExecuteScript user_scripts\RDT.os, entryPoint=ПослеВставкиЗначенияТ9, title=[КА1 серверная] - Общий модуль ирОбщий: Модуль - Конфигуратор - КомплекснаяАвтоматизация
[24.12.25 22:56:31:750] StopAITimer()
[24.12.25 22:56:31:750] Отменяем накопленные обработчики, т.к. подсказка была закрыта.
[24.12.25 22:56:31:750] Set IsProcess: False
[24.12.25 22:56:31:750] Set ClipCursorPosition =
[24.12.25 22:56:31:750] Set PasteForm.IsVisible = False
[24.12.25 22:56:31:750] Set ProtectedWindow = 0
[24.12.25 22:56:31:750] Queue 1:
[24.12.25 22:56:31:750]
[24.12.25 22:56:31:750] Send
[24.12.25 22:56:31:750] KeyboardHookManagerOnKeyUp(): Return
[24.12.25 22:56:31:751] Received await = Return IsProcess=False, IsQueueInProgress=True, (133,9991 ms) fg=280a06 title=[КА1 серверная] - Общий модуль ирОбщий: Модуль - Конфигуратор - КомплекснаяАвтоматизация, KeyData=Return
[24.12.25 22:56:31:751] Key up Return has passed to window 280a06
[24.12.25 22:56:31:751] Send queue completed: 1
[24.12.25 22:56:31:751] _needUpdateCurrentText = True
[24.12.25 22:56:31:751] Закрываем оверлей...
[24.12.25 22:56:31:751] Замер: TOTAL PASTE TIME: 361ms


tormozit
#3, ред. 25 декабря 2025 13:10

Вместо шаблона "Сообщить(<!>);" попробовал передавать шаблон ""Сообщить();" и в обработчике ПослеВставкиЗначенияТ9 выполнил код смещения каретки

	ТурбоКонф.Клавиша(Клавиши.Left);
	ТурбоКонф.Клавиша(Клавиши.Left);

Получилось быстрее вроде бы, т.к. обработку клавиш окном конфигуратора не могу замерить честно.

Затем попробовал в том же обработчике такой код
ТурбоКонф.ВыделитьТекст(ПолеТекстаПрограммы.мПозицияВТексте, ПолеТекстаПрограммы.мПозицияВТексте);
Тоже получилось быстрее (без лишних 200мс) - тут уж точно все честно, т.к. метод синхронный.


bolsun
#4, ред. 25 декабря 2025 12:44

Шаблон с маркером <!>, в отличие от просто метода с параметрами Сообщить(), где достаточно нажать влево, использует универсальное перемещение, за константное время, через метод ВыделитьТекст, т.к. новая позиция может быть далеко от каретки. А также он проверяет новый текст на правильность вставки (вспомни, что позиция может установится неправильно, если переносы строк некорректны).


bolsun
#5, 25 декабря 2025 12:45

(4) возможно для частных случаев, где каретка рядом с новой позицией, достаточно перейти нажатиями клавиш.


bolsun
#6, ред. 25 декабря 2025 13:00

(4) bolsun, при универсальном методе также учитывается, что табуляция после вставки шаблона может заменяться на пробелы, и может быть нестандартной ширины.


bolsun
#7, 25 декабря 2025 12:59

Можно попробовать добавить проверку, что если расстояние между концом шаблона и маркером меньше какого-то количества символов и не содержит табуляции и переносы строк, то выполнить переход через нажатия клавиш.


tormozit
#8, ред. 25 декабря 2025 13:14

(4) bolsun, в (3) я показал что тест с чистым ВыделитьТекст() не приводит к 200мс задержке. Значит дело в дополнительных проверках. Если они не меняют положение каретки, их лучше вынести в асинхронный метод, который выполнится после вставки и не будет задерживать работу пользователя.


tormozit
#9, ред. 25 декабря 2025 13:18

В общем, для подавляюще частого сценария вставки шаблона - фрагмента без переносов строк и табуляций - хотелось бы отключить все лишние действия. Получим таким образом 2-х кратное ускорение вставки шаблона.


bolsun
#10, 25 декабря 2025 13:18

(9) tormozit, есть примеры таких шаблонов? Я вижу подавляющее большинство, с переносами строк и табуляциями.


tormozit
#11, 25 декабря 2025 13:19

(10) bolsun, да, у меня все методы вставляются через шаблон "ИмяМетода(<!>)". Думал что у тебя так же.


bolsun
#12, ред. 25 декабря 2025 13:21

(11) tormozit, у меня все методы вставляются без маркера <!> за около нулевое время перемещения каретки, внутрь скобок.


bolsun
#13, 25 декабря 2025 13:22

(11) tormozit, использовать шаблоны для этого - неправильно.


tormozit
#14, ред. 25 декабря 2025 13:27

(13) bolsun, Вроде уже много раз это обсуждали. Я получаю полную информацию о методе, включая наличие у него параметров, только при вставке, т.е. когда пользователь вставляет его из списка. Тут только либо шаблон, либо ПослеВставки я сам перемещаю каретку (3). Выходит что правильно (3)?
Вроде бы про ПослеВставки ты тоже писал, что неправильно там интерактив делать.


bolsun
#15, ред. 25 декабря 2025 14:22

(14) tormozit,

Перемещение каретки для шаблона теперь осуществляется клавишами и без дополнительных проверок, если расстояние перемещения меньше 10 символов и не содержит переносов строк и табуляций.

6.6.9490.29270
https://disk.yandex.ru/d/XRPUNWQtrbwBUw


tormozit
#16, 25 декабря 2025 15:39

(15) bolsun, проверил. Работает.
tormozit изменил статус на Закрыто


tormozit
#17, 26 декабря 2025 12:13

При вставке шаблона
ПолноеИмя()<!>
новая оптимизация не срабатывает
tormozit изменил статус на Открыто


tormozit
#18, ред. 28 декабря 2025 15:49

Еще не вижу оптимизации при вставке шаблона "Иначе" в середину "ИначеЕсли". Турбоконф зачем то вставляет "Иначе " вместо "Иначе" и затем удаляет крайний пробел. Если же вставлять не в середину слова, то такой шаблон вставляется на 100мс быстрее. Почему так?
fKvDNDy7yW.mp4
Ссылка скрыта


bolsun
#19, 30 декабря 2025 12:44

(18) tormozit, пробел добавляется для корректной вставки, т.к. близлежащее слово мешает определять перемещения каретки и правильно вставлять текст.


tormozit
#20, 30 декабря 2025 13:34

(19) bolsun, не понял. Можешь на примере показать? Или другими словами что плохо случится, если вставить без пробела сразу?


bolsun
#21, 30 декабря 2025 13:39

(20) tormozit, ты же понимаешь, что мало вставить текст, нужно еще подготовится к вставке, как минимум удалить слово слева, дождаться реакции каретки и т.д.? Так вот слово рядом мешает это делать.


tormozit
#22, ред. 30 декабря 2025 13:54

(21) bolsun, Если отправить CTRL+BackSpace, то удалится часть слова слева от каретки, а правая останется. Пробел вставлять для этого не нужно. Пробовал так?


bolsun
#23, 30 декабря 2025 13:55

(22) tormozit, нет, попробую.


bolsun
#24, 31 декабря 2025 12:13

(18) tormozit, убрал вставку пробела в этом случае и перешел на использование Ctrl+Backspace

6.6.9496.25497
https://disk.yandex.ru/d/XRPUNWQtrbwBUw


tormozit
#25, 31 декабря 2025 14:09

(24) bolsun, Проверил. Теперь в этом случае вставляется без задержки.
Но избыточная задержка (17) еще актуальна.


bolsun
#26, 31 декабря 2025 15:33

(25) tormozit, нужен способ воспроизведения, у меня нет такого шаблона (17)


tormozit
#27, 31 декабря 2025 16:15

(26) bolsun, Включи ИР адаптер и вставь слово "ПолноеИмя" из списка
Метаданные.Справочники[0].


bolsun
#28, 09 января 2026 11:33

(17) tormozit,

ПолноеИмя()<!>

Исправил, но смысл этого шаблона мне не понятен. Каретка и так в этом положении после вставки.

6.6.9505.23988
https://disk.yandex.ru/d/XRPUNWQtrbwBUw


tormozit
#29, 09 января 2026 11:38

(28) bolsun, смысл в сгенерированных шаблонах может не всегда быть.


tormozit
#30, 09 января 2026 11:41

tormozit изменил статус на Закрыто


Для вставки изображения или файла, перетащите его в поле редактора или вставьте файл из буфера