6. Ошибка: Событие не смогло вызвать ни одного из абонентов

tormozit Закрыто Средний

Ошибка при выполнении команды "ИР перейти к определению" воспроизводится стабильно.

ScriptEngine.Machine.ExternalSystemException: {Модуль C:\Portable\TurboConf\user_scripts\RDT.os / Ошибка в строке: 605 / Внешнее исключение (System.Runtime.InteropServices.COMException): Событие не смогло вызвать ни одного из абонентов (Исключение из HRESULT: 0x80040201)}
ТурбоКонф.УстановитьЗначение(ИмяВременногоФайла);
---> System.Runtime.InteropServices.COMException: Событие не смогло вызвать ни одного из абонентов (Исключение из HRESULT: 0x80040201)
в UIAutomationClient.IUIAutomation.GetFocusedElement()
в TurboConf.Core.TurboAPI.TurboApi.SetValue(String text)
в lambda_method(Closure , Api , IValue[] )
в ScriptEngine.Machine.Contexts.AutoContext`1.CallAsProcedure(Int32 methodNumber, IValue[] arguments)
в ScriptEngine.Machine.MachineInstance.ResolveMethodProc(Int32 arg)
в ScriptEngine.Machine.MachineInstance.MainCommandLoop()
--- Конец трассировки внутреннего стека исключений ---
в 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, IVariable[] parameters, ScriptOptions options)

[File?path=1165DFE919CB05373C26DFFD93BA26DF9DD382C5&filename=Ссылка скрыта

Комментарии

bolsun
#1, ред. 11 ноября 2023 14:59

Это значит фокус еще не установился в поле ввода. Если происходит ожидание октрытия окна, то нужно либо добавить задержку после
Окно = ТурбоКонф.ЖдатьОкно("Сохранить точки останова в файл", 2000, Истина);

Либо выполнять вызовы с отслеживанием смены RuntimeId

ТекРантаймИД = ТурбоКонф.ЖдатьСменуТекущегоЭлемента(ТекРантаймИД, Таймаут, ВызыватьИсключение)

var runId = TurboApi.GetCurrentElementRuntimeIdAsString();

TurboApi.AltKey(Keys.F9);
TurboApi.WaitForWindow(fg, "Точки останова", 1000);

TurboApi.WaitForCurrentElementChanged(runId, out runId, 500);

TurboApi.CtrlKey(Keys.S);

var saveWnd = TurboApi.WaitForWindow(User32.GetForegroundWindow(), "Сохранить точки останова в файл", 5000);

TurboApi.WaitForCurrentElementChanged(runId, out runId, 200);


tormozit
#2, 11 ноября 2023 16:30

Замечу, что на 5-й версии этот код никогда выдавал такую ошибку. А на 6-й версии ее всегда выдает. Так что кажется дело в чем то другом.


tormozit
#3, 11 ноября 2023 17:20

Перед ошибочной строкой добавил
ТурбоКонф.ЖдатьСменуТекущегоЭлемента(ТурбоКонф.ПолучитьRuntimeId(), 100, Истина);
Ошибка в той строке перестала возникать.
Но такая же ошибка стала возникать далее при вызове
ТурбоКонф.ПолучитьЭлементыСписка();

ScriptEngine.Machine.ExternalSystemException: {Модуль C:\Portable\TurboConf\user_scripts\RDT.os / Ошибка в строке: 506 / Внешнее исключение (System.Runtime.InteropServices.COMException): Время ожидания операции истекло. (Исключение из HRESULT: 0x80131505)}
ТекстыПолей = ТурбоКонф.ПолучитьЭлементыСписка(); // 200мс!
---> System.Runtime.InteropServices.COMException: Время ожидания операции истекло. (Исключение из HRESULT: 0x80131505)
в UIAutomationClient.IUIAutomation.GetFocusedElement()
в TurboConf.Core.TurboAPI.TurboApi./nQ3C'txC: [H}m&n:virdrz).MoveNext()

Я добавил перед ней такую же строку. Но это не помогло.

ScriptEngine.Machine.ExternalSystemException: {Модуль C:\Portable\TurboConf\user_scripts\RDT.os / Ошибка в строке: 502 / Внешнее исключение (System.Runtime.InteropServices.COMException): Событие не смогло вызвать ни одного из абонентов (Исключение из HRESULT: 0x80040201)}
ТурбоКонф.ЖдатьСменуТекущегоЭлемента(ТурбоКонф.ПолучитьRuntimeId(), 500, Истина);
---> System.Runtime.InteropServices.COMException: Событие не смогло вызвать ни одного из абонентов (Исключение из HRESULT: 0x80040201)
в UIAutomationClient.IUIAutomation.GetFocusedElement()

[File?path=1165DFE919CB05373C26DFFD93BA26DF9DD382C5&filename=Ссылка скрыта


tormozit
#4, 11 ноября 2023 17:23

Метод ЖдатьСменуТекущегоЭлемента() есть в 5-й версии?


bolsun
#5, 11 ноября 2023 17:50

(4) tormozit, да


bolsun
#6, 11 ноября 2023 17:55

Я давно использую реализацию с ожиданием, т.к. часто встречал подобную ошибку при открытии окон Сохранить, Загрузить. Окно появляется, но фокус еще приходит.

Проверил еще раз у себя, с ожиданием, все работает стабильно.


tormozit
#7, ред. 11 ноября 2023 18:05

Еще раз отмечаю, что у меня стабильно возникает ошибка при вызове ТурбоКонф.ПолучитьЭлементыСписка() только на 6-й версии. И перед этим вызовом я тоже добавил ЖдатьСменуТекущегоЭлемента().
Вот мой скрипт.
File?path=1165DFE919CB05373C26DFFD93BA26DF9DD382C5%2F49b967c5cbce484c9eb65a6c441f233f&filename=RDT.os

Ошибку и лог я сообщил выше.


bolsun
#8, 13 ноября 2023 17:38

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


tormozit
#9, ред. 13 ноября 2023 19:18

Проблема осталась. Прошу более четко описать пример для 6-й версии.
Я провел тесты 30 раз и пробовал кучу способов. Но всегда у меня возникают ошибки. Вот они

1.
ScriptEngine.Machine.ExternalSystemException: {Модуль C:\Portable\TurboConf\user_scripts\RDT.os / Ошибка в строке: 604 / Внешнее исключение (System.Runtime.InteropServices.COMException): Событие не смогло вызвать ни одного из абонентов (Исключение из HRESULT: 0x80040201)}
ТурбоКонф.ЖдатьСменуТекущегоЭлемента(СтарыйИД, 1000, Истина);

2.
ScriptEngine.Machine.ExternalSystemException: {Модуль C:\Portable\TurboConf\user_scripts\RDT.os / Ошибка в строке: 506 / Внешнее исключение (System.Runtime.InteropServices.COMException): Время ожидания операции истекло. (Исключение из HRESULT: 0x80131505)}
ТекстыПолей = ТурбоКонф.ПолучитьЭлементыСписка(); // 200мс!

3.
ScriptEngine.Machine.ExternalSystemException: {Модуль C:\Portable\TurboConf\user_scripts\RDT.os / Ошибка в строке: 635 / Внешнее исключение (System.Runtime.InteropServices.COMException): Время ожидания операции истекло. (Исключение из HRESULT: 0x80131505)}
СтарыйИД = ТурбоКонф.ПолучитьRuntimeId();

код

СтарыйИД = ТурбоКонф.ПолучитьRuntimeId();
ТурбоКонф.КонтролКлавиша(Клавиши.s);
Окно = ТурбоКонф.ЖдатьОкно("Сохранить точки останова в файл", 1000, Истина);
Если Окно = 0 Тогда
	Возврат "";
КонецЕсли;
ТурбоКонф.ЖдатьСменуТекущегоЭлемента(СтарыйИД, 1000, Истина);

Вот тестируемая версия скрипта.

RDT.os

Нужно встать на вызов любой прикладной функции от объекта и вызвать команду "ИР Перейти к определению"

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


tormozit
#10, 13 ноября 2023 19:30

Проверил еще раз на 5-й версии. Там тот же скрипт работает без ошибок
и с вызовом ТурбоКонф.ЖдатьСменуТекущегоЭлемента() и без него.


bolsun
#11, ред. 13 ноября 2023 19:36

(9) tormozit,

ScriptEngine.Machine.ExternalSystemException: {Модуль C:\Portable\TurboConf\user_scripts\RDT.os / Ошибка в строке: 506 / Внешнее исключение (System.Runtime.InteropServices.COMException): Время ожидания операции истекло. (Исключение из HRESULT: 0x80131505)}
ТекстыПолей = ТурбоКонф.ПолучитьЭлементыСписка(); // 200мс!

3.
ScriptEngine.Machine.ExternalSystemException: {Модуль C:\Portable\TurboConf\user_scripts\RDT.os / Ошибка в строке: 635 / Внешнее исключение (System.Runtime.InteropServices.COMException): Время ожидания операции истекло. (Исключение из HRESULT: 0x80131505)}

Эти ошибки скорее всего возникают из-за слишком малого таймаута ожидания соединения. Он будет увеличен в следующей версии.


tormozit
#12, ред. 14 ноября 2023 07:39

Проверил. Работает.
Причем без вызова ТурбоКонф.ЖдатьСменуТекущегоЭлемента(), что мне кажется говорит о бесполезности применения этой функции для этой цели.


tormozit
#13, 14 ноября 2023 07:40

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


tormozit
#14, ред. 22 ноября 2023 16:46

Проблема снова случилась

ScriptEngine.Machine.ExternalSystemException: {Модуль C:\Portable\TurboConf\user_scripts\RDT.os / Ошибка в строке: 646 / Внешнее исключение (System.Runtime.InteropServices.COMException): Событие не смогло вызвать ни одного из абонентов (Исключение из HRESULT: 0x80040201)}
СтарыйИД = ТурбоКонф.ПолучитьRuntimeId();
---> System.Runtime.InteropServices.COMException: Событие не смогло вызвать ни одного из абонентов (Исключение из HRESULT: 0x80040201)
в UIAutomationClient.IUIAutomation.GetFocusedElement()
в TurboConf.Core.TurboAPI.TurboApi.GetCurrentElementRuntimeId(Int32 parentLevels)
в TurboConf.HostApplication.Api.GetCurrentElementRuntimeId()
в lambda_method(Closure , Api , IValue[] )
в ScriptEngine.Machine.Contexts.AutoContext`1.CallAsFunction(Int32 methodNumber, IValue[] arguments, IValue& retValue)
в ScriptEngine.Machine.MachineInstance.ResolveMethodFunc(Int32 arg)
в ScriptEngine.Machine.MachineInstance.MainCommandLoop()
--- Конец трассировки внутреннего стека исключений ---
в 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, IVariable[] parameters, ScriptOptions options)

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


bolsun
#15, 22 ноября 2023 16:50

(14) tormozit, RuntimeId нужно получить до нажатия Enter, т.к. в этот момент окна уже не существует, а фокус еще не перешел в конфигуратор

СтарыйИД = ТурбоКонф.ПолучитьRuntimeId();	
ТурбоКонф.Клавиша(Клавиши.Enter);	


bolsun
#16, 25 ноября 2023 11:43

Проблема актуальна?
bolsun изменил статус на На выяснении


tormozit
#17, ред. 25 ноября 2023 13:36

Да. Последний раз возникала вчера. Но код скрипта я пока не менял.


bolsun
#18, 25 ноября 2023 23:38

Тикет пока закрываю, если проблема повторится, нужен новый лог с учетом моих рекомендаций в #15. Также заранее прошу не обрезать шапку лога, мне нужна информация оттуда.
bolsun изменил статус на Закрыто


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