таймер в отличие от сервисной ОО не принимает обработчик с необязательными парам

Автор Arbuz, 03 октября 2024, 15:06

« назад - далее »

Arbuz

Добавлю сюда, чтобы не потерялось.
Не то чтобы это проблема.

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

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


Arbuz

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


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

глТаймер() есть здесь.

т.е.

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

Djelf

Поведение понятно.
Например в Функция(парам1,парам2="",парам3) все равно придется задавать все 3 параметра.
Не уверен что из движка 1с возможно получить в Функция(парам1,парам2="",парам3="") что 2 последних параметра необязательны.
Будут глюки. Страшные ;)

Arbuz

Хм... А мне не понятно, почему ОбработкаОжидания принимает, а обработчик Таймера нет.

Arbuz

Эм... Уточню, чтобы наш разговор меньше напоминал общение слепого с глухим. ;)

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

Меня интересует другое: обработчик ожидания объекта Сервис принимает процедуры (а может и функции?) со всеми необязательными параметрами, а обработчик объекта Таймер — нет. А очень хочется.

Djelf

Я сейчас стал передавать АссоциативныйВектор в первом и единственном параметре (завернутый в СписокЗначений, хотелось бы без него, но и так сойдет).

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


Arbuz

Не-не, дело в другом.

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

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

Djelf

Там во втором параметре Интервал = число, а не список значений.

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

P.P.S. Возможно "Обработчик" имеет больше параметров чем требется?

АЛьФ


АЛьФ

Во-первых, в метод ЗадатьОбработчикВГлобальномМодуле передается только один параметр - имя функции, интервал вызова передается в методе Запустить.
Во-вторых, смотри тестовую сборку.

Arbuz

Гм... Обработчик всё принимает, но! Появились какие-то странные лаги. Весь интерфейс начинает жутко тормозить. Тормозит интерфейс всей системы. Пока не закроешь процесс 1С. Заметной разницы в загрузке процессора при этом не заметно. Просто всё лагает — дочерние окна по паре секунд закрываются.
Лагать начинает после отработки вот этого кода:

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



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

глТаймер вот

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

ЗЫ: Обнаружил в чём дело — смотри комментарии

Arbuz

Цитата: АЛьФ от 06 октября 2024, 12:15Во-первых, в метод ЗадатьОбработчикВГлобальномМодуле передается только один параметр - имя функции, интервал вызова передается в методе Запустить.

Не совсем понял — разговор ведь идёт про количество параметров не у методов устанавливающих обработчик, а про количество параметров у самих обработчиков.

Arbuz

Для тех, кто не понял:

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

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

Таймер.ЗадатьОбработчикВГлобальномМодуле("глЭмулироватьКлавиатуру")       // не работает !!!
Таймер.ЗадатьОбработчикВГлобальномМодуле("глЭмулироватьКлавиатуруТаймер") // работает

АЛьФ

Стоп. Я запутался. Работает тестовая сборка, но с тормозами или не работает вообще?