Добавлю сюда, чтобы не потерялось.
Не то чтобы это проблема.
Объект Таймер в отличие от Сервис.ОбработкаОжидания не принимает обработчик с (всеми) необязательными параметрами.
Приходится делать обработчики-переходники (без параметров) для вызова таких.
И вообще, в принципе, нельзя ли в обработчик передавать параметр? Скажем, только по-значению на момент установки обработчика. Опять же, чтобы поменьше плодить какие-то глобальные структуры.
Расшифруй кодом
Процедура глЭмулироватьКлавиатуру(пКлавиши = "", пСпособ = 0) Экспорт
Если пКлавиши = "" Тогда
глТаймер("глЭмулироватьКлавиатуруТаймер"); // глСервис.ОбработкаОжидания("глЭмулироватьКлавиатуру", 0);
глСервис.ПерехватКлавиатуры(глПерехватКлавиатуры);
Возврат;
КонецЕсли;
глПерехватКлавиатуры = глСервис.ПерехватКлавиатуры();
Если глПерехватКлавиатуры = 1 Тогда
глСервис.ПерехватКлавиатуры(0);
КонецЕсли;
Если пСпособ = 0 Тогда
WSHShell.SendKeys(пКлавиши);
Иначе
глСервис.ЭмулироватьКлавиатуру(пКлавиши);
КонецЕсли;
Если глПерехватКлавиатуры = 1 Тогда
глТаймер("глЭмулироватьКлавиатуруТаймер", 20); // глСервис.ОбработкаОжидания("глЭмулироватьКлавиатуру", 20);
КонецЕсли;
КонецПроцедуры // глЭмулироватьКлавиатуру
// Таймер не принимает обработчик с параметрами :(
Процедура глЭмулироватьКлавиатуруТаймер()
глЭмулироватьКлавиатуру();
КонецПроцедуры
глТаймер() есть здесь (https://forum.dorex.pro/index.php?topic=162.msg2286#msg2286).
т.е.
Процедура глОбработчик(пПарам1 = "1", пПарам2 = "бла-бла")
...
...
Сервис.ОбработкаОжидания("глОбработчик", Интервал); // норм
Таймер.ЗадатьОбработчикВГлобальномМодуле("глОбработчик", Интервал); // Выдаёт ошибку на несоответствие количества параметров
Поведение понятно.
Например в Функция(парам1,парам2="",парам3) все равно придется задавать все 3 параметра.
Не уверен что из движка 1с возможно получить в Функция(парам1,парам2="",парам3="") что 2 последних параметра необязательны.
Будут глюки. Страшные ;)
Хм... А мне не понятно, почему ОбработкаОжидания принимает, а обработчик Таймера нет.
Эм... Уточню, чтобы наш разговор меньше напоминал общение слепого с глухим. ;)
Передача параметра в обработчик это просто моя влажная фантазия. Понятно, что там возникают различные проблемы, например, с областью видимости. Даже если передавать только по значению, то объекты параметров надо где-то сохранять. И это, в целом, действительно, требует серьёзной проработки. Хрен с ним.
Меня интересует другое: обработчик ожидания объекта Сервис принимает процедуры (а может и функции?) со всеми необязательными параметрами, а обработчик объекта Таймер — нет. А очень хочется.
Я сейчас стал передавать АссоциативныйВектор в первом и единственном параметре (завернутый в СписокЗначений, хотелось бы без него, но и так сойдет).
Но ты меня окончательно запутал!
ОбработкаОжидания(<Имя>,<Интервал>)
Одинаковая для 1С, для РасширениеФормы.ОбработкаОжидания и для Сервис.ОбработкаОжидания
Передачи параметров нет. Или я что-то не знаю?
Не-не, дело в другом.
Ещё раз, посмотри:
Процедура глОбработчик(пПарам1 = 1, пПарам2 = "бла-бла")
...
КонецПроцедуры //глОбработчик
...
Сервис.ОбработкаОжидания( "глОбработчик", Интервал); // норм
Таймер.ЗадатьОбработчикВГлобальномМодуле("глОбработчик", Интервал); // Выдаёт ошибку на несоответствие количества параметров
Там во втором параметре Интервал = число, а не список значений.
P.S. было бы прикольно туда параметры засовывать, но глюков будет невероятное количество.
P.P.S. Возможно "Обработчик" имеет больше параметров чем требется?
Я попробую убрать это ограничение на параметры.
Во-первых, в метод ЗадатьОбработчикВГлобальномМодуле передается только один параметр - имя функции, интервал вызова передается в методе Запустить.
Во-вторых, смотри тестовую сборку.
Гм... Обработчик всё принимает, но! Появились какие-то странные лаги. Весь интерфейс начинает жутко тормозить. Тормозит интерфейс всей системы. Пока не закроешь процесс 1С. Заметной разницы в загрузке процессора при этом не заметно. Просто всё лагает — дочерние окна по паре секунд закрываются.
Лагать начинает после отработки вот этого кода:
Процедура глЭмулироватьКлавиатуру(пКлавиши = "", пСпособ = 0) Экспорт
Если пКлавиши = "" Тогда
глТаймер("глЭмулироватьКлавиатуруТаймер"); // Так всё работает нормально и на 198 и на 199
// Но стоит исключить процедуру прокладку и начинает лагать
// ЗЫ: Обнаружил в чём дело — таймер не останавливается в этой строке если передать обработчик с параметрами.
глСервис.ПерехватКлавиатуры(глПерехватКлавиатуры);
Возврат;
КонецЕсли;
глПерехватКлавиатуры = глСервис.ПерехватКлавиатуры();
Если глПерехватКлавиатуры = 1 Тогда
глСервис.ПерехватКлавиатуры(0);
КонецЕсли;
Если пСпособ = 0 Тогда
WSHShell.SendKeys(пКлавиши);
Иначе
глСервис.ЭмулироватьКлавиатуру(пКлавиши);
КонецЕсли;
Если глПерехватКлавиатуры = 1 Тогда
глТаймер("глЭмулироватьКлавиатуруТаймер", 20); // глСервис.ОбработкаОжидания("глЭмулироватьКлавиатуру", 20);
КонецЕсли;
КонецПроцедуры // глЭмулироватьКлавиатуру
// Таймер не принимает обработчик с параметрами :(
Процедура глЭмулироватьКлавиатуруТаймер()
глЭмулироватьКлавиатуру();
КонецПроцедуры
глТаймер вот
Функция глТаймер(пТаймер = 0, пИнтервал = 0) Экспорт
Если ТипЗначенияСтр(ПулТаймеров) <> "АссоциативныйВектор" Тогда // глобальная переменная
ПулТаймеров = СоздатьОбъект("АссоциативныйВектор");
КонецЕсли;
Если пТаймер = 0 Тогда
ПулТаймеров.Очистить();
Возврат 0;
КонецЕсли;
Если ТипЗначения(пТаймер) = 2 Тогда // строка
_Поз = ПулТаймеров.НайтиКлюч(пТаймер, 1);
Если _Поз < 0 Тогда
ПулТаймеров.Добавить(СоздатьОбъект("Таймер"), пТаймер);
ПулТаймеров.Получить(_Поз).ЗадатьОбработчикВГлобальномМодуле(пТаймер);
КонецЕсли;
Если ПулТаймеров.Получить(_Поз).Запущен = 1 Тогда
ПулТаймеров.Получить(_Поз).Остановить();
КонецЕсли;
Если пИнтервал > 0 Тогда
ПулТаймеров.Получить(_Поз).Запустить(пИнтервал);
ИначеЕсли пИнтервал = -1 Тогда
ПулТаймеров.Удалить(_Поз);
КонецЕсли;
КонецЕсли;
Возврат ПулТаймеров.Количество();
КонецФункции // глТаймер
ЗЫ: Обнаружил в чём дело — смотри комментарии
Цитата: АЛьФ от 06 октября 2024, 12:15Во-первых, в метод ЗадатьОбработчикВГлобальномМодуле передается только один параметр - имя функции, интервал вызова передается в методе Запустить.
Не совсем понял — разговор ведь идёт про количество параметров не у методов устанавливающих обработчик, а про количество параметров у самих обработчиков.
Для тех, кто не понял:
глЭмулироватьКлавиатуру(пКлавиши = "", пСпособ = 0) // Это обработчик с параметрами (необязательными, т.е. можно вызывать без них)
глЭмулироватьКлавиатуруТаймер() // а это обработчик-прокладка совсем без параметров, который штатно вызывает первый без указания оных
Сервис.ОбработкаОжидания( "глЭмулироватьКлавиатуру") // работает
Сервис.ОбработкаОжидания( "глЭмулироватьКлавиатуруТаймер") // работает
Таймер.ЗадатьОбработчикВГлобальномМодуле("глЭмулироватьКлавиатуру") // не работает !!!
Таймер.ЗадатьОбработчикВГлобальномМодуле("глЭмулироватьКлавиатуруТаймер") // работает
Стоп. Я запутался. Работает тестовая сборка, но с тормозами или не работает вообще?
Совсем забыл упомянуть, что в таймере при вызове игнорируются для параметров значения по умолчанию (даже их наличие не проверяется). Просто передается массив пустых параметров.
Не работает остановка таймера.
Цитата: Arbuz от 08 октября 2024, 13:53Не работает остановка таймера.
Метод Таймер::Остановить() не останавливает таймер? Нужна тестовая обработка, на которой я мог бы воспроизвести глюк. У меня все останавливается при тестировании.
Ага! Делал тестовую и нашёл свой затык:
Процедура глОбработчик(пПарам1 = "", пПарам2 = 0) Экспорт
Если пПарам1 = "" Тогда // Ложь
Если пПарам2 = 0 Тогда // Ложь
Если ПустоеЗначение(пПарам1) = 1 Тогда // Истина
В принципе, ты говорил об этом
Цитата: АЛьФ от 08 октября 2024, 09:30Совсем забыл упомянуть, что в таймере при вызове игнорируются для параметров значения по умолчанию (даже их наличие не проверяется). Просто передается массив пустых параметров.
Интересно, что для ОбработкаОжидания из того же формекса — умолчания устанавливаются.
Цитата: Arbuz от 09 октября 2024, 17:38Если пПарам2 = 0 Тогда // Ложь
Здесь, похоже, я не прав