ВставитьТекст() в большом модуле выполняется в 10 раз дольше если выделенный диапазон и вставляемый текст содержат перенос строки

tormozit Открыто Высокий

Если выделить многострочный строковый литерал в большом модуле (пробовал и в начале и в конце модуля). Например такой

ф = "ВалютаРегламентированногоУчета1
|";


И выполнить

ТурбоКонф.ВставитьТекст("ВалютаРегламентированногоУчета2
|";

То вставка в модуле размером 5 тыс. строк у меня стабильно занимает 1200мс. А вставка однострочного литерала в том же месте занимает <100мс

Комментарии

tormozit
#1, 30 декабря 2023 19:39

Лог прилагаю

Ссылка скрыта


bolsun
#2, ред. 03 января 2024 17:52

В логе не вижу медленной вставки, как и строк которые на скриншоте. Возможно лог не тот.

У меня вставка происходит быстро, но фрагмент кода возможно некорректный, т.к. содержит синтаксическую ошибку, а также судя по всему код должен вставлять значение как оно есть (с кавычками и символом переноса строк), я так предполагаю судя по выделению на скриншоте.
bolsun изменил статус на На выяснении


tormozit
#3, ред. 03 января 2024 18:48

Сделал внешнюю обработку. Надо открыть ее модуль и выделить метод ДобавитьСловоЛокальногоКонтекста. Далее нужно программно вставить выделенный текст вместо исходного с добавлением табуляции в начале.
В моем скрипте тест проводился командой "ИР Форматировать текст". Скрипт я могу выложить, но работать без обновления ИР он не будет.


Ссылка скрыта
ОтважныйБобр.epf


bolsun
#4, 03 января 2024 19:14

(3) tormozit, вставляет быстро.


tormozit
#5, 03 января 2024 19:16

(4) bolsun, В логе видно, что вставляет 1200мс


bolsun
#6, 03 января 2024 19:17

(5) tormozit, в логе вижу. У меня вставляет быстро.


tormozit
#7, 03 января 2024 19:18

Ищи фиксированные задержки в своем коде, которые в сумме дают 1200мс. Длительность высоко стабильная.


tormozit
#8, 03 января 2024 19:25

Вот фрагмент замера из скрипта

	МоментНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
	ТурбоКонф.ВставитьТекст(ТекстВставки); 
	Сообщить("Вставка блока " + (ТекущаяУниверсальнаяДатаВМиллисекундах() - МоментНачала) + "мс");

RDT.os


bolsun
#9, 03 января 2024 19:26

(7) tormozit, почему 1000 мс - вполне понятно. Это максимальное время первой проверки вставки. А 200 мс повторная проверка.
Вопрос в том почему первая не проходит.


bolsun
#10, 03 января 2024 19:27

Есть одно предположение, скину тестовую.


bolsun
#11, 03 января 2024 19:35

https://disk.yandex.ru/d/XKCz9ijzgtoO1w


tormozit
#12, 03 января 2024 20:14

Ссылка скрыта
Проблема сохранилась.


bolsun
#13, 03 января 2024 20:18

(12) tormozit, почему в логе два вызова вставить текст идет с интервалом 200 мс?


tormozit
#14, 03 января 2024 20:18

Записал видео с новым логом. Вызывал команду "Форматировать текст". Проблема случается часто, но не всегда. Обязательное условие - вставляемый текст отличается от выделенного фрагмента в поле документа и должно быть больше одной строки.

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


tormozit
#15, 03 января 2024 20:19

(13) bolsun, https://turboconf.ru/Tasks/9025


bolsun
#16, 03 января 2024 20:23

(15) tormozit, при множественной вставке из буфера, всегда будут возникать различного рода проблемы.


bolsun
#17, 03 января 2024 20:24

Нужен чистый тест, с одним вызовом вставки.


bolsun
#18, ред. 03 января 2024 20:31

(15) tormozit, написал в той теме, как запомнить выделение без вызова метода ВставитьТекст.


tormozit
#19, ред. 04 января 2024 11:33

Еще раз провел тест (14) и записал лог.
Все средства для воспроизведения приложены.
ИР 7.08 опубликована
ИР адаптер 1.19 опубликован
ОтважныйБобр.epf
Ссылка скрыта


bolsun
#20, 04 января 2024 15:14

bolsun изменил статус на Подтвержденный баг


bolsun
#21, 04 января 2024 15:34

(19) @tormozit, https://disk.yandex.ru/d/XKCz9ijzgtoO1w


tormozit
#22, 04 января 2024 15:41

Проверил. Теперь задержка всегда маленькая 100-200мс.
tormozit изменил статус на Закрыто


tormozit
#23, ред. 05 января 2024 14:33

Снова случилась. Теперь в базе редактора скриптов. В методе ПерейтиПоСсылкеСтрокиМодуля() нужно выделить слово "Значение" и выполнить команду "ИР Переименовать слово"


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


tormozit
#24, 14 января 2024 17:05

Проблему регулярно наблюдаю. Вот свежий лог

Ссылка скрыта


bolsun
#25, ред. 14 января 2024 19:50

(23) tormozit, пытался выполнить инструкцию, получил ошибку

ScriptEngine.Machine.PropertyAccessException: {Модуль D:\Projects\TurboConf\TurboConf.HostApplication\bin\Debug\user_scripts\RDT.os / Ошибка в строке: 1970 / Свойство объекта не обнаружено (ВесьМодульИзменен)}
ПередатьИзмененияИзПоляТекстаВОкноМодуля(ПолеТекстаПрограммы,, Результат.ВесьМодульИзменен); в ScriptEngine.Machine.Contexts.UnmanagedCOMWrapperContext.FindProperty(String name)
в ScriptEngine.Machine.MachineInstance.ResolveProp(Int32 arg)
в ScriptEngine.Machine.MachineInstance.MainCommandLoop()
в ScriptEngine.Machine.MachineInstance.ExecuteCode()
в ScriptEngine.Machine.MachineInstance.ExecuteMethod(IRunnable sdo, Int32 methodIndex, IValue[] arguments)
в ScriptEngine.Machine.Contexts.ScriptDrivenObject.CallAsFunction(Int32 methodNumber, IValue[] arguments, IValue& retValue)
в TurboConf.HostApplication.HostApplicationForm.ExecuteScript(Script script, Keys ctrl, Keys alt, Keys shift, ScreenForm statusForm, String entryPoint, ScriptOptions options, IVariable[] parameters) в D:\Projects\TurboConf\TurboConf.HostApplication\HostApplicationForm.cs:строка 274

//@script_version 16


bolsun
#26, 14 января 2024 19:52

Было обновление ИР перед этим. После перезапуска клиента командой "Завершить работу клиента", заработало. Почему бы не перезапускать клиент автоматом, после обновления?


bolsun
#27, 14 января 2024 19:57

На примере из (23) у меня не воспроизводится.


tormozit
#28, ред. 14 января 2024 19:59

(27) bolsun, измени новое слово, иначе фактической вставки Турбоконф не сделает, т.е. нужно сделать фактическое переименование.


tormozit
#29, 14 января 2024 19:59

(26) bolsun, записал себе в заметки для подумать


bolsun
#30, 14 января 2024 20:10

(28) tormozit, не воспроизводится. Если есть возможность воспроизвести нужен ролик.


tormozit
#31, 14 января 2024 20:26

Y9vu9NE1fM.mp4


tormozit
#32, ред. 15 января 2024 10:46

Та же проблема с командой "ИР Переименовать слово" и на другом рабочем месте в другой конфигурации
Ссылка скрыта


bolsun
#33, 15 января 2024 20:49

У меня все эти примеры отрабатывают нормально, видимо есть какие-то нюансы воспроизведения.


tormozit
#34, ред. 15 января 2024 20:54

Ну видимо нужно расширить в Турбоконфе логирование этой операции, если видео и текущий лог не помогают.


tormozit
#35, 16 января 2024 15:28

Примерно 4 из 5 раз при выполнении команды "ИР Переименовать слово" возникает эта задержка.

[Лог с новой версии Ссылка скрыта


bolsun
#36, 16 января 2024 18:36

Воспроизвел. Отличие было в размерах окна модуля. В твоем примере граница выделения заменяемого фрагмента уходила за нижнюю границу окна модуля, в моих тестах влезало в окно целиком.
bolsun изменил статус на Подтвержденный баг


bolsun
#37, 16 января 2024 20:58

(35) tormozit, проверь на этой версии
https://disk.yandex.ru/d/XKCz9ijzgtoO1w


tormozit
#38, 16 января 2024 21:05

(37) bolsun, проверил. Из 10 тестов все выполнились менее чем за 300мс. Видимо исправлено.
tormozit изменил статус на Закрыто


tormozit
#39, ред. 31 января 2024 11:20

Еще пример вставки 1500мс
Ссылка скрыта

Вставлял текст запроса вместо старого в приложенном методе Clip_550421.html
tormozit изменил статус на Открыто


tormozit
#40, 11 февраля 2024 18:28

Еще пример вставки 5300мс
Ссылка скрыта


bolsun
#41, 16 февраля 2024 14:12

(40) tormozit, в данном случае проблема была вызвана тем, что платформа не смогла ответить на запрос UIAutomation за 5сек.

[11.02.24 18:27:26:321] System.Runtime.InteropServices.COMException (0x80131505): Время ожидания операции истекло. (Исключение из HRESULT: 0x80131505)
в UIAutomationClient.IUIAutomation.GetFocusedElementBuildCache(IUIAutomationCacheRequest cacheRequest)
в TurboConf.Core.TurboAPI.TurboApi.GetUIAutomationCachedInfo(IntPtr fg, IUIAutomationElement elem, UIAutoFlags flags)

Почему это могло произойти нужно смотреть скрипт, я так произошло после закрытия такого окна

[11.02.24 18:27:10:717] Окно найдено, found=140318264 , PID=20064, title='Переименовать слово'


tormozit
#42, ред. 24 февраля 2024 12:14

1400мс в маленьком модуле
Ссылка скрыта


tormozit
#43, 24 февраля 2024 12:16

Переподключил приложения ИР. Снова 1400мс. Похоже не зависит от его окон.
Ссылка скрыта


tormozit
#44, 25 февраля 2024 08:53

5200мс
Ссылка скрыта

Сразу после этого вызвал список методов модуля и он выполнялся 30 секунд! Тоже есть в логе.
Пора с этим что то делать.


tormozit
#45, ред. 25 февраля 2024 10:03

5200мс
Ссылка скрыта
Сразу после этого вызвал окно служебных сообщений Турбоконфа. Оно открывалось 30 секунд! Тоже есть в логе.


bolsun
#46, 25 февраля 2024 12:40

(45) tormozit, как я выше писал, ошибка не связана с размером текста

[25.02.24 08:51:14:373] System.Runtime.InteropServices.COMException (0x80131505): Время ожидания операции истекло. (Исключение из HRESULT: 0x80131505)
в UIAutomationClient.IUIAutomation.GetFocusedElementBuildCache(IUIAutomationCacheRequest cacheRequest)
в TurboConf.Core.TurboAPI.TurboApi.GetUIAutomationCachedInfo(IntPtr fg, IUIAutomationElement elem, UIAutoFlags flags)

Нужно смотреть конкретное место в скрипте, где делается эта вставка.


tormozit
#47, 25 февраля 2024 12:44

Вставку делает строка скрипта
ТурбоКонф.ВставитьТекст(ТекстВставки);


bolsun
#48, 25 февраля 2024 12:44

Перед ошибкой вижу в скрипте
[25.02.24 08:51:10:125] StopExternalWindowCallAsync..
[25.02.24 08:51:10:121] Warning: Работа TurboConf ВОЗОБНОВЛЕНА после диалога с приложением ИР
Ctrl+C
Ctrl+V


bolsun
#49, ред. 25 февраля 2024 12:45

(47) tormozit, ошибка возникает до вставки. Перед ВставитьТекст() идет Ctrl+C Ctrl+V


tormozit
#50, 25 февраля 2024 12:46

(49) bolsun, Что есть ошибка?
Я не писал про ошибку. Я писал про длительность вставки, которую замеряет и выводит Турбоконф.


bolsun
#51, ред. 25 февраля 2024 12:48

(50) tormozit, что-то в твоем скрипте делает Ctrl+C Ctrl+V, что блокирует UIAutomation на 5секунд, что влияет на время выполнения команды ВставитьТекст().


bolsun
#52, 25 февраля 2024 12:48

Еще раз 5 секунд к времени выполнения вызваны предыдущими действиями скрипта. Покажи код.


tormozit
#53, 25 февраля 2024 12:49

(51) bolsun, Ctrl+C Ctrl+V делается умышленно в методе СохранитьГраницыВыделенияДляОтмены() по твоему совету - для сохранения границ выделения в истории редактирования модуля


bolsun
#54, 25 февраля 2024 12:51

(53) tormozit, UIAutomation платформы не отвечает, когда происходят операции с буфером. Значит нужно дождаться окончания операции копирования/вставки из буфера, например окном Поиск.


tormozit
#55, ред. 25 февраля 2024 13:01

Тогда прошу снова рассмотреть возможность реализации опционального сохранения границ выделения в истории редактирования в методе ВставитьТекст() или в отдельном методе СохранитьГраницыВыделенияДляОтмены() в API. Это нужно не редко. А самому пройти через все сложности будет очень непросто. https://turboconf.ru/Tasks/9025


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