Таймер внутри класса
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*)()", т.е. на функцию вообще без параметров.
Вопрос - как сделать данный таймер?
Есть класс, в котором надо по таймеру вызывать опр. метод. Если использовать TTimer, то ему при создании надо владельца указывать. Если в качестве владельца указать NULL, то он не хочет вызывать событие OnTimer.
Сразу вопрос: сколько предполагается иметь экземпляров класса, содержащего таймер? Дело в том, что наличие нескольких таймеров в программе приводит к существенному замедлению их работы или полному отказу, т. е. процедура таймера вообще не вызывается.
В связи с этим нами было принято решение создать один-единственный экземпляр таймера, который будет выполнять поступающие запросы сразу от всех объектов, которым требуется синхронизация во времени. Таймер в этом случае проще всего создать от Application.
Сразу вопрос: сколько предполагается иметь экземпляров класса, содержащего таймер? Дело в том, что наличие нескольких таймеров в программе приводит к существенному замедлению их работы или полному отказу, т. е. процедура таймера вообще не вызывается.
Экземпляров будет в районе 10 (или меньше). Друг с другом они никак не взаимодействуют. Каждый объект по таймеру(у объектов могут быть разные промежутки времени) проверяет свое состояние и если произошло опр. событие сообщает пользователю. Вариант с одним таймером в моем случае реализуем (раз в минуту разослать десятку объектов сообщение о прошествии единицы времени не так уж и накладно:)), но если бы объектов было в районе сотни, а промежуток времени - в районе секунды, то тогда как?
Экземпляров будет в районе 10 (или меньше). Друг с другом они никак не взаимодействуют. Каждый объект по таймеру(у объектов могут быть разные промежутки времени) проверяет свое состояние и если произошло опр. событие сообщает пользователю.
Для Винды (или VCL - так и не поняли, кто виноват) это уже много. Проблемы возникали буквально после третьего таймера.
Если не предполагается синхронизация с медленным оборудованием или сетью, одна секунда - это очень много. Сколько частота процессора на средней рабочей станции потенциальных пользователей вашей программы?
Если событие возникает для медленных компонентов системы, то простите, это задача уже не для таймера. Придется использовать дополнительные ухищрения.
Кстати, наша задача с использованием "разделяемого" таймера была предельно простой - мигание контролов, после комплексной проверки данных в которых обнаружена ошибка. Заводится список контролов с ошибками, и...
Сразу вопрос: сколько предполагается иметь экземпляров класса, содержащего таймер? Дело в том, что наличие нескольких таймеров в программе приводит к существенному замедлению их работы или полному отказу, т. е. процедура таймера вообще не вызывается.
В связи с этим нами было принято решение создать один-единственный экземпляр таймера, который будет выполнять поступающие запросы сразу от всех объектов, которым требуется синхронизация во времени. Таймер в этом случае проще всего создать от Application.
А привести пример, как от Application завести таймер можно?
А привести пример, как от Application завести таймер можно?
А что без стандартного таймера совсем не как?
Сделай к примеру в какой нить функции,лучше в отдельной потоке от основного потока примерно следующее:
void timer(DWORD time)
{
while()
{
Sleep(time);
//какой нить код который нужно выполнять к примеру черезе 1 секунду.
}
}
ну и сюда можно добавить кучу ограничений,и самое главное будет работать быстрее и точнее чем стандартный таймер. Единственное что конечно здесь будет нужен дополнительный поток на каждый таймер.
А что без стандартного таймера совсем не как?
Сделай к примеру в какой нить функции,лучше в отдельной потоке от основного потока примерно следующее:
void timer(DWORD time)
{
while()
{
Sleep(time);
//какой нить код который нужно выполнять к примеру черезе 1 секунду.
}
}
ну и сюда можно добавить кучу ограничений,и самое главное будет работать быстрее и точнее чем стандартный таймер. Единственное что конечно здесь будет нужен дополнительный поток на каждый таймер.
Все работает, спасибо =)
(Тока while я убрал, и без него хорошо =)