Переключение на Главную Страницу Страницы: [1] 2 3 4 ОтправитьПечать
Очень популярная тема (более 25 ответов) Встроенный класс Таймер (число прочтений - 25941 )
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Встроенный класс Таймер
25. Сентября 2007 :: 06:44
Печать  
Народ, как думаете, нужен ли нам отдельный встроенный в 1С++ или ФормЕкс класс Таймер?

Т.е. я предполагаю его использование вместо Сервис.ОбработкаОжидания или РасширениеФормы.ОбработкаОжидания и собрать их функционал в одном классе.


Данный класс сможет работать с любой формой или модулем или произвольным контекстом.
Я вижу такой интерфейс
Цитата:
void Запустить(Интервал);
void Остановить();
Число ЗадатьОбработчикВГлобальномМодуле(НаименованиеОбработчика);
Число ЗадатьОбработчикВМодулеФормы(КонтекстФормы, НаименованиеОбработчика);
Число ЗадатьОбработчикВОбъекте(Объект, НаименованиеОбработчика);
void УдалитьОбработчик();
void Отладка_ВыполнитьСобытиеТаймера() - используется для возможности экстренного посыла события и отработки события в обработчике. Фактически это только для тестирования.
2 свойства (только для чтения)
  - Интервал и Запущен

и виртуальный метод
void Событие_Таймер(Число ФСО);
void Событие_Таймер();


Все методы тривиальны, кроме последнего.

Метод Событие_Таймер я планирую использовать для поддержки ООП, т.е. данный метод всегда будет вызываться при событии от таймера.
Т.е. можно создать КОП-наследник таймера, переопределить в нем метод Событие_Таймер(), выполнить свою обработку.
И если стандартный вызов не нужен, то можно не вызывать метод База.Событие_Таймер().

А метод Событие_Таймер во встроенном классе как раз и будет вызывать необходимые обработчики, заданные одной из функций ЗадатьОбработчикXXX

Жду ответов.
« Последняя редакция: 02. Октября 2007 :: 10:37 - artbear »  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #1 - 25. Сентября 2007 :: 07:21
Печать  
Точнее, лучше сделать так
Цитата:
и виртуальный метод
void Событие_Таймер();


Метод Событие_Таймер я планирую использовать для поддержки ООП, т.е. данный метод всегда будет вызываться при событии от таймера.
Т.е. можно создать КОП-наследник таймера, переопределить в нем метод Событие_Таймер(), выполнить свою обработку.
и если не вызвать метод База.Событие_Таймер(), то и стандартного вызова/обработки!

А метод Событие_Таймер во встроенном классе как раз и будет вызывать необходимые обработчики, заданные одной из функций ЗадатьОбработчикXXX
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #2 - 25. Сентября 2007 :: 07:33
Печать  
Естественно, для одного объекта Таймер будет возможен только один обработчик - либо в глобальнике, либо в модуле формы, либо в произвольном контексте.
Попытка установить еще один обработчик будет приводить к исключению.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Valet
Full Member
***
Отсутствует



Сообщений: 141
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #3 - 25. Сентября 2007 :: 10:21
Печать  
Стоит, так как будет удобнее и нагляднее.
  

/ Лень - двигатель прогресса. /
Наверх
ICQ  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Встроенный класс Таймер
Ответ #4 - 26. Сентября 2007 :: 18:57
Печать  
Чегой-то я не понял. А каково будет время жизни этого объекта? Где надо будет хранить таймер, чтобы он вызывал ОбработчикВМодулеФормы?

Нет, я, в принципе, понимаю, что хранить его можно будет где угодно. Но где реально вы предполагаете его хранить? А помните про проблемы, связанные с разрушением объектов формы?

Опять же, это будет настоящий таймер, или таймер обработки ожидания? Если я заведу его на 10 мсек и запущу обработку на 10 минут, то таймер сработает?
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #5 - 27. Сентября 2007 :: 09:44
Печать  
Давно мечтаю о таком классе
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #6 - 27. Сентября 2007 :: 13:23
Печать  
Отвечаю по пунктам:

sedmin писал(а) 26. Сентября 2007 :: 18:57:
1) А каково будет время жизни этого объекта? Где надо будет хранить таймер, чтобы он вызывал ОбработчикВМодулеФормы?

1) Время жизни объекта произвольное, как определит пользователь класса, т.е. наиболее гибкое поведение.
По поводу работы с формой то же самое.

В дальнейшем можно сделать один из вариантов или их объединение
        а) таймер, который работает с формой, перестает быть валидным, когда форма закрывается. Т.е. абсолютна та же схема, что и для значения контекста формы (пока форма открыта, его тип 100, как закрыта, тип = 0)
Соответственно пользователю подобного таймера нужно будет проверять его тип значения.
Для других видов таймеров такой проблемы нет.

        б) Также можно добавить указанный таймер как элемент Формы - т.е. добавить спец. контекст к групповому контексту формы и обращаться к нему через Форма.НужныйТаймер.
Как реализовать подобную схему, мне понятно, осталось дело за реализацией.
ЗЫ кстати, подобная привязка к форме мной планируется для добавляемых на форму атрибутов Улыбка

sedmin писал(а) 26. Сентября 2007 :: 18:57:
2) Нет, я, в принципе, понимаю, что хранить его можно будет где угодно. Но где реально вы предполагаете его хранить? А помните про проблемы, связанные с разрушением объектов формы?

См. п.1
А проблемы, связанные с разрушением объектов формы, легко решаются с помощью придуманного нами смарт-пойнтера CSafeContextPtr - примеры использования есть в коде 1С++ Улыбка

sedmin писал(а) 26. Сентября 2007 :: 18:57:
3) Опять же, это будет настоящий таймер, или таймер обработки ожидания? Если я заведу его на 10 мсек и запущу обработку на 10 минут, то таймер сработает?

Что значит "настоящий таймер"? тот, который работает независимо от работы, выполняемой приложением, называется Поток, и мы от его использования отказались Улыбка

А остальные таймеры в однопоточном приложении зависят от того, обрабатывает ли приложение сообщения Винды или оно загружено непрерывной работой.
Так что все ограничения подобных таймеров остаются Печаль - т.е. если 1С выполняет какой-то код, то событие таймера сгенерится только после завершения кода.

Для некоторого обхода подобных ограничений я планирую добавить в ФормЕкс некий метод, который заставит 1С обработать очередь сообщений винды. В итоге пользователь сможет вызывать этот метод для обработки каких-то нужных сообщений - например, удобно использовать для отрисовки прогресс-бара во время длительной работы 1С или еще чего Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Встроенный класс Таймер
Ответ #7 - 02. Октября 2007 :: 09:47
Печать  
to artbear
Пробую сейчас #74
1. Расскажи, плиз, что из ранее запланированного применил в классе Таймер.
2. Что изменено в ЗакрытьВсеОкна(), он ведь был уже раньше?
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #8 - 02. Октября 2007 :: 09:53
Печать  
vip писал(а) 02. Октября 2007 :: 09:47:
to artbear
Пробую сейчас #74
1. Расскажи, плиз, что из ранее запланированного применил в классе Таймер.
2. Что изменено в ЗакрытьВсеОкна(), он ведь был уже раньше?

1. Все, что написано в посте 0, осталось.
Добавилось только
метод УдалитьОбработчик
метод Отладка_ВыполнитьСобытиеТаймера - используется для возможности экстренного посыла события и отработки события в обработчике. Фактически это только для тестирования.
и 2 свойства (только для чтения) - Интервал и Запущен

2. ИМХО просто метод ЗакрытьВсеОкна должен быть в классе "Окна" - теперь метод Сервис::ЗакрытьВсеОкна просто вызывает Окна::ЗакрытьВсеОкна.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Встроенный класс Таймер
Ответ #9 - 02. Октября 2007 :: 09:57
Печать  
Понял. Спасибо. Будем пробовать.
  
Наверх
ICQ  
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Встроенный класс Таймер
Ответ #10 - 02. Октября 2007 :: 10:16
Печать  
to artbear
ЗадатьОбработчик() ты видимо убрал, ругается на отсутствие метода.
А так вроде все работает.
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #11 - 02. Октября 2007 :: 10:36
Печать  
vip писал(а) 02. Октября 2007 :: 10:16:
to artbear
ЗадатьОбработчик() ты видимо убрал, ругается на отсутствие метода.
А так вроде все работает.

Виноват, читать как "ЗадатьОбработчикВОбъекте"
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #12 - 02. Октября 2007 :: 12:35
Печать  
artbear писал(а) 25. Сентября 2007 :: 06:44:
Метод Событие_Таймер я планирую использовать для поддержки ООП, т.е. данный метод всегда будет вызываться при событии от таймера.
Т.е. можно создать КОП-наследник таймера, переопределить в нем метод Событие_Таймер(), выполнить свою обработку.
И если стандартный вызов не нужен, то можно не вызывать метод База.Событие_Таймер().

Вот эта возможность пока не реализована, возможно, появится в будущих версиях.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #13 - 02. Октября 2007 :: 12:35
Печать  
пока тут пробовал новый функционал вот что нарыл

1. Данная конструкция в модальной форме повесила 1С и вылетела в итоге в трубу. При этом в статусной строке очень много раз было показано "выполняется обработка".
Окна = СоздатьОбъект("Окна");
Окна.ЗакрытьВсеОкна();

2. Конструкция вот такого характера

Процедура Сооб()
     Сообщить("Что-то");
КонецПроцедуры      // Сооб

Процедура КНКНК()
     Таймер = СоздатьОбъект("Таймер");
     Таймер.Запустить(10);
     Таймер.ЗадатьОбработчикВМодулеФормы(Контекст,"Сооб()");
     Сообщить(Таймер.Запущен);
     Сообщить(Таймер.Интервал);
КонецПроцедуры      // КНКНК

выдала в сообщении

Таймер.ЗадатьОбработчикВМодулеФормы(Контекст,"Сооб()");
{G:\РАБОТА В ФИРМАХ\ПТБ\ПРОЕКТЫ\ВНЗМ\ОТЧЕТ №3\ОТЧЕТ_УПРОТЧЕТНАСТРОЙКА.ERT(729)}: ВНИМАНИЕ: создание таймера - не найден метод <Сооб()> в модуле формы или у него количество параметров более нуля

И если честно хочется чуть больше пояснения по Таймеру. А то документация очень обрывочная у меня выходит.  Плачущий
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #14 - 02. Октября 2007 :: 12:37
Печать  
vandalsvq писал(а) 02. Октября 2007 :: 12:35:
пока тут пробовал новый функционал вот что нарыл

1. Данная конструкция в модальной форме повесила 1С и вылетела в итоге в трубу. При этом в статусной строке очень много раз было показано "выполняется обработка".
Окна = СоздатьОбъект("Окна");
Окна.ЗакрытьВсеОкна();

2. Конструкция вот такого характера
     Таймер.ЗадатьОбработчикВМодулеФормы(Контекст,"Сооб()");

1. Я же говорю, что все недостатки Сервис::ЗакрытьВсеОкна остались, планирую исправить в будущем.

2. Написано же "наименование метода в форме", а не вызов Улыбка
Использовать так
     Таймер.ЗадатьОбработчикВМодулеФормы(Контекст,"Сооб");
т.е. без скобок Улыбка

  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 4
ОтправитьПечать