Форум Кладовочки АЛьФ`а

Обсуждение проектов => FormEx => Тема начата: Arbuz от 03 октября 2024, 15:06

Название: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Arbuz от 03 октября 2024, 15:06
Добавлю сюда, чтобы не потерялось.
Не то чтобы это проблема.

Объект Таймер в отличие от Сервис.ОбработкаОжидания не принимает обработчик с (всеми) необязательными параметрами.
Приходится делать обработчики-переходники (без параметров) для вызова таких.

И вообще, в принципе, нельзя ли в обработчик передавать параметр? Скажем, только по-значению на момент установки обработчика. Опять же, чтобы поменьше плодить какие-то глобальные структуры.
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Djelf от 03 октября 2024, 17:30
Расшифруй кодом
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Arbuz от 04 октября 2024, 14:41
Процедура глЭмулироватьКлавиатуру(пКлавиши = "", пСпособ = 0) Экспорт
    Если пКлавиши = "" Тогда
        глТаймер("глЭмулироватьКлавиатуруТаймер"); // глСервис.ОбработкаОжидания("глЭмулироватьКлавиатуру", 0);
        глСервис.ПерехватКлавиатуры(глПерехватКлавиатуры);
        Возврат;
    КонецЕсли;
    глПерехватКлавиатуры = глСервис.ПерехватКлавиатуры();
    Если глПерехватКлавиатуры = 1 Тогда
        глСервис.ПерехватКлавиатуры(0);
    КонецЕсли;
    Если пСпособ = 0 Тогда
        WSHShell.SendKeys(пКлавиши);
    Иначе
        глСервис.ЭмулироватьКлавиатуру(пКлавиши);
    КонецЕсли;
    Если глПерехватКлавиатуры = 1 Тогда
        глТаймер("глЭмулироватьКлавиатуруТаймер", 20); //  глСервис.ОбработкаОжидания("глЭмулироватьКлавиатуру", 20);
    КонецЕсли;
КонецПроцедуры // глЭмулироватьКлавиатуру


// Таймер не принимает обработчик с параметрами :(
Процедура глЭмулироватьКлавиатуруТаймер()
    глЭмулироватьКлавиатуру();
КонецПроцедуры


глТаймер() есть здесь (https://forum.dorex.pro/index.php?topic=162.msg2286#msg2286).

т.е.

Процедура глОбработчик(пПарам1 = "1", пПарам2 = "бла-бла")
...
...
Сервис.ОбработкаОжидания("глОбработчик", Интервал); // норм
Таймер.ЗадатьОбработчикВГлобальномМодуле("глОбработчик", Интервал); // Выдаёт ошибку на несоответствие количества параметров
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Djelf от 04 октября 2024, 15:00
Поведение понятно.
Например в Функция(парам1,парам2="",парам3) все равно придется задавать все 3 параметра.
Не уверен что из движка 1с возможно получить в Функция(парам1,парам2="",парам3="") что 2 последних параметра необязательны.
Будут глюки. Страшные ;)
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Arbuz от 04 октября 2024, 15:39
Хм... А мне не понятно, почему ОбработкаОжидания принимает, а обработчик Таймера нет.
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Arbuz от 04 октября 2024, 16:06
Эм... Уточню, чтобы наш разговор меньше напоминал общение слепого с глухим. ;)

Передача параметра в обработчик это просто моя влажная фантазия. Понятно, что там возникают различные проблемы, например, с областью видимости. Даже если передавать только по значению, то объекты параметров надо где-то сохранять. И это, в целом, действительно, требует серьёзной проработки. Хрен с ним.

Меня интересует другое: обработчик ожидания объекта Сервис принимает процедуры (а может и функции?) со всеми необязательными параметрами, а обработчик объекта Таймер — нет. А очень хочется.
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Djelf от 04 октября 2024, 16:23
Я сейчас стал передавать АссоциативныйВектор в первом и единственном параметре (завернутый в СписокЗначений, хотелось бы без него, но и так сойдет).

Но ты меня окончательно запутал!
ОбработкаОжидания(<Имя>,<Интервал>)
Одинаковая для 1С, для РасширениеФормы.ОбработкаОжидания и для Сервис.ОбработкаОжидания
Передачи параметров нет. Или я что-то не знаю?

Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Arbuz от 04 октября 2024, 16:26
Не-не, дело в другом.

Ещё раз, посмотри:


Процедура глОбработчик(пПарам1 = 1, пПарам2 = "бла-бла")
...
КонецПроцедуры //глОбработчик
...
Сервис.ОбработкаОжидания( "глОбработчик", Интервал); // норм
Таймер.ЗадатьОбработчикВГлобальномМодуле("глОбработчик", Интервал); // Выдаёт ошибку на несоответствие количества параметров
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Djelf от 04 октября 2024, 16:41
Там во втором параметре Интервал = число, а не список значений.

P.S. было бы прикольно туда параметры засовывать, но глюков будет невероятное количество.

P.P.S. Возможно "Обработчик" имеет больше параметров чем требется?
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: АЛьФ от 04 октября 2024, 16:50
Я попробую убрать это ограничение на параметры.
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: АЛьФ от 06 октября 2024, 12:15
Во-первых, в метод ЗадатьОбработчикВГлобальномМодуле передается только один параметр - имя функции, интервал вызова передается в методе Запустить.
Во-вторых, смотри тестовую сборку.
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Arbuz от 07 октября 2024, 17:04
Гм... Обработчик всё принимает, но! Появились какие-то странные лаги. Весь интерфейс начинает жутко тормозить. Тормозит интерфейс всей системы. Пока не закроешь процесс 1С. Заметной разницы в загрузке процессора при этом не заметно. Просто всё лагает — дочерние окна по паре секунд закрываются.
Лагать начинает после отработки вот этого кода:

Процедура глЭмулироватьКлавиатуру(пКлавиши = "", пСпособ = 0) Экспорт
Если пКлавиши = "" Тогда
глТаймер("глЭмулироватьКлавиатуруТаймер"); // Так всё работает нормально и на 198 и на 199
                                                           // Но стоит исключить процедуру прокладку и начинает лагать
                                                           // ЗЫ: Обнаружил в чём дело — таймер не останавливается в этой строке если передать обработчик с параметрами. 
глСервис.ПерехватКлавиатуры(глПерехватКлавиатуры);
Возврат;
КонецЕсли;
глПерехватКлавиатуры = глСервис.ПерехватКлавиатуры();
Если глПерехватКлавиатуры = 1 Тогда
глСервис.ПерехватКлавиатуры(0);
КонецЕсли;
Если пСпособ = 0 Тогда
WSHShell.SendKeys(пКлавиши);
Иначе
глСервис.ЭмулироватьКлавиатуру(пКлавиши);
КонецЕсли;
Если глПерехватКлавиатуры = 1 Тогда
глТаймер("глЭмулироватьКлавиатуруТаймер", 20); // глСервис.ОбработкаОжидания("глЭмулироватьКлавиатуру", 20);
КонецЕсли;
КонецПроцедуры // глЭмулироватьКлавиатуру



// Таймер не принимает обработчик с параметрами :(
Процедура глЭмулироватьКлавиатуруТаймер()
глЭмулироватьКлавиатуру();
КонецПроцедуры


глТаймер вот

Функция глТаймер(пТаймер = 0, пИнтервал = 0) Экспорт

Если ТипЗначенияСтр(ПулТаймеров) <> "АссоциативныйВектор" Тогда // глобальная переменная
ПулТаймеров = СоздатьОбъект("АссоциативныйВектор");
КонецЕсли;

Если пТаймер = 0 Тогда
ПулТаймеров.Очистить();
Возврат 0;
КонецЕсли;

Если ТипЗначения(пТаймер) = 2 Тогда // строка
_Поз = ПулТаймеров.НайтиКлюч(пТаймер, 1);
Если _Поз < 0 Тогда
ПулТаймеров.Добавить(СоздатьОбъект("Таймер"), пТаймер);
ПулТаймеров.Получить(_Поз).ЗадатьОбработчикВГлобальномМодуле(пТаймер);
КонецЕсли;

Если ПулТаймеров.Получить(_Поз).Запущен = 1 Тогда
ПулТаймеров.Получить(_Поз).Остановить();
КонецЕсли;

Если пИнтервал > 0 Тогда
ПулТаймеров.Получить(_Поз).Запустить(пИнтервал);
ИначеЕсли пИнтервал = -1 Тогда
ПулТаймеров.Удалить(_Поз);
КонецЕсли;
КонецЕсли;

Возврат ПулТаймеров.Количество();

КонецФункции // глТаймер


ЗЫ: Обнаружил в чём дело — смотри комментарии
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Arbuz от 07 октября 2024, 17:20
Цитата: АЛьФ от 06 октября 2024, 12:15Во-первых, в метод ЗадатьОбработчикВГлобальномМодуле передается только один параметр - имя функции, интервал вызова передается в методе Запустить.

Не совсем понял — разговор ведь идёт про количество параметров не у методов устанавливающих обработчик, а про количество параметров у самих обработчиков.
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Arbuz от 07 октября 2024, 17:36
Для тех, кто не понял:

глЭмулироватьКлавиатуру(пКлавиши = "", пСпособ = 0) // Это обработчик с параметрами (необязательными, т.е. можно вызывать без них)
глЭмулироватьКлавиатуруТаймер() // а это обработчик-прокладка совсем без параметров, который штатно вызывает первый без указания оных

Сервис.ОбработкаОжидания(                "глЭмулироватьКлавиатуру")       // работает
Сервис.ОбработкаОжидания(                "глЭмулироватьКлавиатуруТаймер") // работает

Таймер.ЗадатьОбработчикВГлобальномМодуле("глЭмулироватьКлавиатуру")       // не работает !!!
Таймер.ЗадатьОбработчикВГлобальномМодуле("глЭмулироватьКлавиатуруТаймер") // работает
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: АЛьФ от 07 октября 2024, 21:59
Стоп. Я запутался. Работает тестовая сборка, но с тормозами или не работает вообще?
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: АЛьФ от 08 октября 2024, 09:30
Совсем забыл упомянуть, что в таймере при вызове игнорируются для параметров значения по умолчанию (даже их наличие не проверяется). Просто передается массив пустых параметров.
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Arbuz от 08 октября 2024, 13:53
Не работает остановка таймера.
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: АЛьФ от 08 октября 2024, 15:20
Цитата: Arbuz от 08 октября 2024, 13:53Не работает остановка таймера.
Метод Таймер::Остановить() не останавливает таймер? Нужна тестовая обработка, на которой я мог бы воспроизвести глюк. У меня все останавливается при тестировании.
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Arbuz от 09 октября 2024, 17:38
Ага! Делал тестовую и нашёл свой затык:
Процедура глОбработчик(пПарам1 = "", пПарам2 = 0) Экспорт
       
    Если пПарам1                = "" Тогда // Ложь
    Если пПарам2                = 0  Тогда // Ложь
    Если ПустоеЗначение(пПарам1) = 1  Тогда // Истина

В принципе, ты говорил об этом
Цитата: АЛьФ от 08 октября 2024, 09:30Совсем забыл упомянуть, что в таймере при вызове игнорируются для параметров значения по умолчанию (даже их наличие не проверяется). Просто передается массив пустых параметров.

Интересно, что для ОбработкаОжидания из того же формекса — умолчания устанавливаются.
Название: Re: таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам
Отправлено: Arbuz от 09 октября 2024, 17:59
Цитата: Arbuz от 09 октября 2024, 17:38Если пПарам2                = 0  Тогда // Ложь
Здесь, похоже, я не прав