Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Таймер внутри класса

1.1K
13 июня 2004 года
teran
73 / / 15.04.2003
Есть класс, в котором надо по таймеру вызывать опр. метод. Если использовать TTimer, то ему при создании надо владельца указывать. Если в качестве владельца указать NULL, то он не хочет вызывать событие OnTimer. С WinAPI'шным SetTimer тоже фигня какая-то - если верить SDK, то функция таймера должна иметь вид -

VOID CALLBACK TimerProc(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
);
Однако билдер при попытке вызвать SetTimer с указателем на функцию имеющую подобный прототип говорит, что ему надо указатель "int (_stdcall*)()", т.е. на функцию вообще без параметров.

Вопрос - как сделать данный таймер?
10
13 июня 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by teran
Есть класс, в котором надо по таймеру вызывать опр. метод. Если использовать TTimer, то ему при создании надо владельца указывать. Если в качестве владельца указать NULL, то он не хочет вызывать событие OnTimer.


Сразу вопрос: сколько предполагается иметь экземпляров класса, содержащего таймер? Дело в том, что наличие нескольких таймеров в программе приводит к существенному замедлению их работы или полному отказу, т. е. процедура таймера вообще не вызывается.
В связи с этим нами было принято решение создать один-единственный экземпляр таймера, который будет выполнять поступающие запросы сразу от всех объектов, которым требуется синхронизация во времени. Таймер в этом случае проще всего создать от Application.

1.1K
13 июня 2004 года
teran
73 / / 15.04.2003
Цитата:
Originally posted by smartsoft

Сразу вопрос: сколько предполагается иметь экземпляров класса, содержащего таймер? Дело в том, что наличие нескольких таймеров в программе приводит к существенному замедлению их работы или полному отказу, т. е. процедура таймера вообще не вызывается.


Экземпляров будет в районе 10 (или меньше). Друг с другом они никак не взаимодействуют. Каждый объект по таймеру(у объектов могут быть разные промежутки времени) проверяет свое состояние и если произошло опр. событие сообщает пользователю. Вариант с одним таймером в моем случае реализуем (раз в минуту разослать десятку объектов сообщение о прошествии единицы времени не так уж и накладно:)), но если бы объектов было в районе сотни, а промежуток времени - в районе секунды, то тогда как?

10
13 июня 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by teran

Экземпляров будет в районе 10 (или меньше). Друг с другом они никак не взаимодействуют. Каждый объект по таймеру(у объектов могут быть разные промежутки времени) проверяет свое состояние и если произошло опр. событие сообщает пользователю.


Для Винды (или VCL - так и не поняли, кто виноват) это уже много. Проблемы возникали буквально после третьего таймера.

Цитата:
Вариант с одним таймером в моем случае реализуем (раз в минуту разослать десятку объектов сообщение о прошествии единицы времени не так уж и накладно:)), но если бы объектов было в районе сотни, а промежуток времени - в районе секунды, то тогда как?


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

Кстати, наша задача с использованием "разделяемого" таймера была предельно простой - мигание контролов, после комплексной проверки данных в которых обнаружена ошибка. Заводится список контролов с ошибками, и...

11K
08 декабря 2005 года
madstorm
9 / / 19.08.2005
Цитата:
Originally posted by Freeman
Сразу вопрос: сколько предполагается иметь экземпляров класса, содержащего таймер? Дело в том, что наличие нескольких таймеров в программе приводит к существенному замедлению их работы или полному отказу, т. е. процедура таймера вообще не вызывается.
В связи с этим нами было принято решение создать один-единственный экземпляр таймера, который будет выполнять поступающие запросы сразу от всех объектов, которым требуется синхронизация во времени. Таймер в этом случае проще всего создать от Application.



А привести пример, как от Application завести таймер можно?

406
08 декабря 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by madstorm
А привести пример, как от Application завести таймер можно?


А что без стандартного таймера совсем не как?
Сделай к примеру в какой нить функции,лучше в отдельной потоке от основного потока примерно следующее:
void timer(DWORD time)
{
while()
{
Sleep(time);
//какой нить код который нужно выполнять к примеру черезе 1 секунду.
}
}

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

11K
08 декабря 2005 года
madstorm
9 / / 19.08.2005
Цитата:
Originally posted by vitaly2003s
А что без стандартного таймера совсем не как?
Сделай к примеру в какой нить функции,лучше в отдельной потоке от основного потока примерно следующее:
void timer(DWORD time)
{
while()
{
Sleep(time);
//какой нить код который нужно выполнять к примеру черезе 1 секунду.
}
}

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



Все работает, спасибо =)
(Тока while я убрал, и без него хорошо =)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог