Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Встроенный класс Таймер (число прочтений - 24702 )
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 записан
 
vandalsvq
1c++ power user
Отсутствует


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

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

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

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

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

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



Ну я так не играю  Плачущий, я до этого как сюда запостить так и писал, но сообщение не поступало, поэтому вопреки своему убеждению написал со скобочками и в итоге получил то что получил.

Кстати пара вопросов:

1. объясни про ЗапуститьОбработчикВОбъекте, что за "объект"
2. и когда надо инициировать метод "запустить(Интервал)" ???
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #16 - 02. Октября 2007 :: 12:58
Печать  
1) Этот метод может вызывать совершенно любой метод с количеством параметров 0 для любого контекста, в т.ч. и классы КОП.
Т.е. ему можешь передать объект своего класса и название метода в классе, и по событию таймера управление будет получать твой класс.

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 записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #17 - 02. Октября 2007 :: 13:05
Печать  
artbear писал(а) 02. Октября 2007 :: 12:58:
1) Этот метод может вызывать совершенно любой метод с количеством параметров 0 для любого контекста, в т.ч. и классы КОП.
Т.е. ему можешь передать объект своего класса и название метода в классе, и по событию таймера управление будет получать твой класс.

2) ИМХО тебя все проблема в том, что объект Таймер является локальным для процедуры, закинь его в переменные модуля формы и будешь получать сообщения Улыбка
А сейчас по выходе из процедуры Таймер автоматически удаляется Улыбка


Блин я и не подумал... однако надо спать почаще и отдыхать чуть подольше. Спасибо за помощь  Подмигивание
  

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



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Встроенный класс Таймер
Ответ #18 - 02. Октября 2007 :: 13:05
Печать  
Цитата:
1) Этот метод может вызывать совершенно любой метод с количеством параметров 0 для любого контекста, в т.ч. и классы КОП.
Т.е. ему можешь передать объект своего класса и название метода в классе, и по событию таймера управление будет получать твой класс.

Для этого все и задумывалось, так?
И получилось Улыбка
А в остальном это та же ОбработкаОжидания из FormEx.
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #19 - 09. Октября 2007 :: 12:49
Печать  
vip писал(а) 02. Октября 2007 :: 13:05:
А в остальном это та же ОбработкаОжидания из FormEx.

Да, в принципе функционал почти совпадает с ОбработкойОжидания, но есть и отличия.

Кстати, у ОбработкиОжидания есть одна фича (баг?) - она работает только, когда активно главное окно 1С.
Если переключится на другую программу, то обработка ожидания работать не будет, что не всегда удобно.

Таймер пока страдает таким же поведением, но я его от этого обязательно отучу Улыбка
  

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



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Встроенный класс Таймер
Ответ #20 - 09. Октября 2007 :: 13:50
Печать  
artbear писал(а) 09. Октября 2007 :: 12:49:
vip писал(а) 02. Октября 2007 :: 13:05:
А в остальном это та же ОбработкаОжидания из FormEx.

Да, в принципе функционал почти совпадает с ОбработкойОжидания, но есть и отличия.

Кстати, у ОбработкиОжидания есть одна фича (баг?) - она работает только, когда активно главное окно 1С.
Если переключится на другую программу, то обработка ожидания работать не будет, что не всегда удобно.

Таймер пока страдает таким же поведением, но я его от этого обязательно отучу Улыбка

Вот как раз у ОбработкиОжидания из FormEx нет такой фичи (бага) Улыбка
Она работает, даже когда главное окно 1С свернуто. А вот штатная ОбработкаОжидания нет (хотя насчет штатной может я и ошибаюсь).
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

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

А с обработкой ожидания FormEx был вопрос: работает ли она в момент, когда выполняется проведение документа, к примеру.
Безопасно ли из обработчика завершать работу системы?

Но ответа я не помню, к сожалению.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Встроенный класс Таймер
Ответ #22 - 09. Октября 2007 :: 14:39
Печать  
Цитата:
Со штатной обработкой ожидания нет проблем, когда окно не активно.

Да и класс Таймер работает, только что проверил. Так что Артур не прав.
Цитата:
А с обработкой ожидания FormEx был вопрос: работает ли она в момент, когда выполняется проведение документа, к примеру.
Безопасно ли из обработчика завершать работу системы?

А почему нет? Насколько я понимаю, процедура выполняется в idle-time.
У меня работают одновременно несколько таймеров с интервалом 1мс, выполняюшие роль своеобразных листенером с малым временем отклика. Проблем не заметил. Процессор от работы таймеров не грузится.
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Встроенный класс Таймер
Ответ #23 - 09. Октября 2007 :: 15:40
Печать  
vip писал(а) 09. Октября 2007 :: 14:39:
Цитата:
Со штатной обработкой ожидания нет проблем, когда окно не активно.

Да и класс Таймер работает, только что проверил. Так что Артур не прав.
Цитата:
А с обработкой ожидания FormEx был вопрос: работает ли она в момент, когда выполняется проведение документа, к примеру.
Безопасно ли из обработчика завершать работу системы?

А почему нет? Насколько я понимаю, процедура выполняется в idle-time.
У меня работают одновременно несколько таймеров с интервалом 1мс, выполняюшие роль своеобразных листенером с малым временем отклика. Проблем не заметил. Процессор от работы таймеров не грузится.

Как на ваших версиях 1cpp и formex работает следующий тест.
Нет ли ошибок?

Херня какая-то с прикреплением файла.
Чуть позже попробую еще раз.
  

ERR_ONIDLE.RAR ( 13 KB | Загрузки )

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Встроенный класс Таймер
Ответ #24 - 09. Октября 2007 :: 16:07
Печать  
Получилось.
Форум не виноват.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Встроенный класс Таймер
Ответ #25 - 09. Октября 2007 :: 16:23
Печать  
Цитата:
Как на ваших версиях 1cpp и formex работает следующий тест.
Нет ли ошибок?

Херовато отрабатывает Злой

ФорматнаяСтрока::_Флаг_к(Строка __знач=) : Индекс не входит в границы списка значений.
Возврат СокрЛ(Формат(мПараметры.ПолучитьЗначение(мНомерПараметра), "Ч15.0")) +__знач;
{КлассФорматнаяСтрока@MD(57) }

Описание ошибки: ФорматнаяСтрока::_Строка(Строка __стр=внутренний цикл к) : ФорматнаяСтрока::_Флаг_к(Строка __знач=) : Индекс не входит в границы списка значений.
Возврат СокрЛ(Формат(мПараметры.ПолучитьЗначение(мНомерПараметра), "Ч15.0")) +__знач;
{КлассФорматнаяСтрока@MD(57) }

Но тест драконовский какой-то Озадачен

Если сделать интервал 1сек (минимально возможный штатный), то нормально отрабатывает.
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Встроенный класс Таймер
Ответ #26 - 09. Октября 2007 :: 16:25
Печать  
У меня то же самое.
И иногда обработка ожидания зависает (в смысле не останавливается в стопе, либо до стопа просто не доходит). Печаль

vip писал(а) 09. Октября 2007 :: 16:23:
Но тест драконовский какой-то Озадачен

обычный стресс-тест...
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #27 - 10. Октября 2007 :: 08:48
Печать  
vip писал(а) 09. Октября 2007 :: 14:39:
Цитата:
Со штатной обработкой ожидания нет проблем, когда окно не активно.

Да и класс Таймер работает, только что проверил. Так что Артур не прав.

Да, ошибся, согласен.
Но ведь я как-то нарывался на подобное поведение.
Попробую поискать.

Да, был на 100% уверен, что ОбработкаОжидания и Таймер не будут работать, когда работает какая-то другая обработка, не отпуская проц.
Это здорово и дает нам некое подобие многопоточности Улыбка

ЗЫ из-за этой "многопоточности" тест kms и падает - т.к. идет обращение к переменной Ф в глобальнике из обработки ожидания и обработки цикла.
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #28 - 10. Октября 2007 :: 08:49
Печать  
kms писал(а) 09. Октября 2007 :: 16:25:
И иногда обработка ожидания зависает (в смысле не останавливается в стопе, либо до стопа просто не доходит). Печаль

Я вообще Стоп не могу нажать, не реагирует Печаль

kms писал(а) 09. Октября 2007 :: 16:25:
vip писал(а) 09. Октября 2007 :: 16:23:
Но тест драконовский какой-то Озадачен

обычный стресс-тест...

Да, хороший тест Улыбка
  

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


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Встроенный класс Таймер
Ответ #29 - 10. Октября 2007 :: 10:09
Печать  
artbear писал(а) 09. Октября 2007 :: 12:49:
vip писал(а) 02. Октября 2007 :: 13:05:
А в остальном это та же ОбработкаОжидания из FormEx.

Да, в принципе функционал почти совпадает с ОбработкойОжидания, но есть и отличия.

Кстати, у ОбработкиОжидания есть одна фича (баг?) - она работает только, когда активно главное окно 1С.
Если переключится на другую программу, то обработка ожидания работать не будет, что не всегда удобно.

Таймер пока страдает таким же поведением, но я его от этого обязательно отучу Улыбка


При свернутом 1С все работает нормально. В смысле FE ОбработкаОжидания()
  
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Встроенный класс Таймер
Ответ #30 - 10. Октября 2007 :: 10:17
Печать  
Цитата:
Да, был на 100% уверен, что ОбработкаОжидания и Таймер не будут работать, когда работает какая-то другая обработка, не отпуская проц.
Это здорово и дает нам некое подобие многопоточности

Да, это дает некое подобие многопоточности (если не издеваться над железом, как kms Очень довольный)
Скоро будет год, как я одновременно использую несколько ОбработокОжидания с малым интервалом для очень серьезных задач. Так что не переживай Улыбка
  
Наверх
ICQ  
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #31 - 17. Марта 2009 :: 06:20
Печать  
а кто знает, можно ли реализовать такое...
есть выборка документов и в цикле бы на время уснуть, потом продолжить цикл и т.д. после некоторого количества секунд?

Сейчас конечно сделал процедуру в которой Предупреждение("",10) выдается, а теле кода использую _GetPerformanceCounter() и смотрю, если разница есть по интервалу, то вызываю эту процедуру.

Но у предупреждение есть недостаток того, что засыпает нафиг если не активное окно.
и всплывание его постоянно, тоже не кузяво Улыбка
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
EugenVitla
Junior Member
**
Отсутствует


школьнег

Сообщений: 82
Местоположение: Москва
Зарегистрирован: 21. Марта 2008
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #32 - 17. Марта 2009 :: 07:19
Печать  
pavlo писал(а) 17. Марта 2009 :: 06:20:
а кто знает, можно ли реализовать такое...
есть выборка документов и в цикле бы на время уснуть, потом продолжить цикл и т.д. после некоторого количества секунд?

У romix есть ВК для этого. Что-то вроде 1Csleep называлась.
  
Наверх
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #33 - 17. Марта 2009 :: 07:36
Печать  
Я сделал так (без sleep):

. В рабочем цикле, после каждой итерации, идет проверка по _GetPerformanceCounter() не превышен ли установленный интервал работы и если да - цикл стопится.
. Запускается обработка ожиджания, которая по истечении желаемой паузы запустит цикл дальше.
. Во время паузы можно нажать кнопку "стоп" или успеть что-нибудь сделать в 1С Улыбка
  
Наверх
ICQ  
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #34 - 17. Марта 2009 :: 07:53
Печать  
dnp писал(а) 17. Марта 2009 :: 07:36:
Я сделал так (без sleep):

. В рабочем цикле, после каждой итерации, идет проверка по _GetPerformanceCounter() не превышен ли установленный интервал работы и если да - цикл стопится.
. Запускается обработка ожиджания, которая по истечении желаемой паузы запустит цикл дальше.
. Во время паузы можно нажать кнопку "стоп" или успеть что-нибудь сделать в 1С Улыбка


Ага, так почти и сделано, кстати спасибо, есть же классный метод у класса Система.Уснуть() и при не активном окне пашет Улыбка
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #35 - 17. Марта 2009 :: 09:20
Печать  
Да, я Система::Уснуть для подобных задач и делал Улыбка
  

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



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #36 - 17. Марта 2009 :: 10:07
Печать  
artbear писал(а) 17. Марта 2009 :: 09:20:
Да, я Система::Уснуть для подобных задач и делал Улыбка


Ага, делал просто субъективный тест и получилось при базовой нагрузке на проц 30% при работе, если Предупреждение("",5) делать то проц падает до 1-5%, а если уснуть до 0% Улыбка
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
Valera
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 01. Августа 2009
Re: Встроенный класс Таймер
Ответ #37 - 01. Августа 2009 :: 22:20
Печать  
У меня не работает:

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

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

...в чем может быть дело?
  
Наверх
 
IP записан
 
khomen
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 02. Августа 2009
Re: Встроенный класс Таймер
Ответ #38 - 02. Августа 2009 :: 14:00
Печать  
Valera писал(а) 01. Августа 2009 :: 22:20:
У меня не работает:

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

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

...в чем может быть дело?


Переменную таймер объяви, уже выше написано.
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #39 - 14. Октября 2009 :: 06:37
Печать  
Не могу понять - у меня таймер срабатывает ограниченное количество раз Ужас
Создаю объект, переменная объявлена.
Код
Выбрать все
	Таймер = СоздатьОбъект("Таймер");
	Таймер.ЗадатьОбработчикВОбъекте(вирт(), "Таймер");
	Таймер.Запустить(5000);
 


При параметре 5000 событие вызывается только один раз. При параметре 500 - ровно 10 раз. Если поставить 5, то окончания я не дождался - работает вроде как положено.
Что обидно, даже если записать обработчик вот так:
Код
Выбрать все
// ===============================
Процедура Таймер() Экспорт
	Сообщить("Таймер " + ТекущееВремя());
	Таймер = СоздатьОбъект("Таймер");
	Таймер.ЗадатьОбработчикВОбъекте(вирт(), "Таймер");
	Таймер.Запустить(5000);
КонецПроцедуры //Таймер
 


то второй раз событые не вызывается Озадачен. Что я не так делаю?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #40 - 14. Октября 2009 :: 10:52
Печать  
Переменная Таймер должна быть глобальной - например, в модуле формы или в ГМ.
  

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


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #41 - 14. Октября 2009 :: 13:59
Печать  
Я пишу класс, который должен вызывать сам себя, создание таймера хочу делать в конструкторе. переменная таймер - это переменная класса (или как это называется? Приватное свойство).
Нужно вынести в форму, которая содержит экземпляр класса? Ща проверю
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #42 - 15. Октября 2009 :: 02:57
Печать  
classic писал(а) 14. Октября 2009 :: 13:59:
Я пишу класс, который должен вызывать сам себя, создание таймера хочу делать в конструкторе. переменная таймер - это переменная класса (или как это называется? Приватное свойство).
Нужно вынести в форму, которая содержит экземпляр класса? Ща проверю

Нет, в этом случае в форму таймер выносить не обязательно.
Главное, чтобы таймер не удалялся сразу же после создания, как в таком коде
Цитата:
Перем Таймер;
Таймер = СоздатьОбъект("Таймер");
Таймер.ЗадатьОбработчикВОбъекте(вирт(), "Таймер");
Таймер.Запустить(5000);
  

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


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #43 - 15. Октября 2009 :: 05:38
Печать  
Класс у меня тыщи на 2 строк, уже года три в разработке. Там в друго местем была переменная с тем же названием, давно забыл об этом участке - как туда выполнение попадало, так таймер и останавливалсяУлыбка
Пора, наверное, в отпуск - что-то количество моих вопросов, на которые и сам мог бы ответить, в последнее время зашкаливает.
  
Наверх
 
IP записан
 
sergey78
YaBB Newbies
*
Отсутствует



Сообщений: 10
Зарегистрирован: 11. Июня 2008
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #44 - 11. Ноября 2009 :: 13:22
Печать  
как-нибудь решается проблема следующего вида:
когда по таймеру выполняется какая-нибудь процедура, то поле ввода, в котором находится курсор, полностью выделяется....
Из-за этого пользователь набирает текст, а тут бац - таймер сработал, весь текст выделился и тут же удалился, т.к. пользователь нажал очередной символ.... Плачущий
  
Наверх
ICQ  
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #45 - 11. Ноября 2009 :: 13:46
Печать  
Странно, недавно как раз проверял такое поведение, при использовании объекта "Таймер" такого вроде не наблюдал..
Причем когда то давно тоже сталкивался с такими же жалобами пользователей, поэтому в этот раз специально проверял..
  
Наверх
 
IP записан
 
sergey78
YaBB Newbies
*
Отсутствует



Сообщений: 10
Зарегистрирован: 11. Июня 2008
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #46 - 11. Ноября 2009 :: 14:14
Печать  
В обработчике выполнил объект "Запрос" и поле ввода выделилось, затем убрал "Запрос" и вставил запрос на 1с++ - О чудо - выделение поля ввода не произошло... Улыбка
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Встроенный класс Таймер
Ответ #47 - 12. Ноября 2009 :: 08:04
Печать  
Таймер ни в чем не виноват.
Смотрите свой код.
  

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


I Love YaBB 2!

Сообщений: 86
Зарегистрирован: 02. Июля 2007
Re: Встроенный класс Таймер
Ответ #48 - 29. Марта 2021 :: 10:52
Печать  
1c++ 3.2.4.3

если в классе создать таймер (приват переменная) и задать обработчик процедуру класса через

ЗадатьОбработчикВОбъекте(я(), "ПроцедураКласса")

то не отрабатывает деструктор класса.

Это как-то обойти можно?

Если поставить по срабатыванию таймера УдалитьОбработчик(), то вылетает 1с после деструктора.

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать