PDA

Просмотр полной версии : [Руководство] Таймер - зардержки при отправке пакетов


J-Fobos
31.08.2010, 01:23
Довольно много вопросов по использованию таймера. Создам специально тему, что бы они больше не поднимались.

В большинстве случаев таймер используется для отправки пакетов с заданным интервалом или для отправки пакетов с задержкой.

Начнем.

Сначала надо объявить переменную типа TTimer глобально, на весь скрипт:

var
Timer01: TTimer;

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

procedure Init;
begin
Timer01:=TTimer.Create(nil); //выделяем память и т.п.
Timer01.OnTimer:=@OnTimer01; //привязываем процедуру к событию
Timer01.enabled:=true; //начальное положение включен(true)/выключен(false)
Timer01.interval:=500; //интервал(в миллисекундах) как часто таймер срабатывает
end;

После этого надо написать процедуру
procedure OnTimer01(Sender: TObject);
begin
//тут набор команд, которые будут
//выполняться каждый раз, когда таймер сработает
end;

Более подробно можно прочесть в книжках по ObjectPascal.

=========================

Для отправки нескольких пакетов с заданным интервалом (не обязательно чтоб интервал был одинаковый) в наборе команд, которые будут выполняться каждый раз, когда таймер сработает надо вписать код

case TimerCyrcle of
1: Begin {набор команд} End;
2: Begin {набор команд} End;
3: Begin {набор команд} End;
//4.. 5.. 6.. сколько надо
else
Begin
TimerCyrcle:=1;
Timer01.enabled:=false;
End;
End;
Inc(TimerCyrcle);

Только не забудьте глобально объявить переменную TimerCyrcle как integer, а также задать ее начальное значение перед запуском таймера.
В любой момент можно использовать команду Timer01.interval:=1000; для изменения интервала срабатывания таймера.

Желаю удачи в использовании таймера.

=========== Дополнено ===============
Информация выше была для скриптов пакетхака, но кроме него есть еще и викед патчер. Рассмотрим работу таймера и в этой программе.

В скриптах для ВП нет возможности создать такой объект как таймер, но есть функция-событие OnTimer которая работает почти так как нам надо. Принцип использования немного сложный для понимания из за своей нестандартности.
Функция вызывается уже встроенным таймером посредством функции gSys.SetTimer

Пример использования (взят из официальной документации):
function OnTimer(ntimer, count : integer) : boolean;
// ntimer - номер таймера (1..3) который вызвал это событие.
// count - счетчик срабатываний для данного таймера, сбрасывается при SetTimer;
begin
result := true; // false - остановит данный таймер
...
end;

Установка таймеров:
gSys.SetTimer(ntimer, interval : integer;[nscript : integer]);
установка таймера 'ntimer' (1..3) с интервалом 'interval' ms.
Всего можно использовать до 15-ти таймеров (по 5 на каждый скрипт).
'nscript' - номер скрипта, по умолчанию он соответствует текущему скрипту.
Установка интервала в 0 - выключает таймер, порог точности ~15ms.
Пример:
gSys.SetTimer(1,300); // установит вызов 'OnTimer(1)' каждые 300ms (0.3сек)
gSys.SetTimer(1,0); // остановить таймер 1


============================
Если возникает необходимость использовать большое количество таймеров (лично я с таким никогда не сталкивался), то посмотрите пример который идет в комплекте программой
procedure OnCreate;
begin
gSys.SetTimer(1,1000); // устанавливаем первый таймер каждую секунду
gSys.SetTimer(2,300); // устанавливаем второй таймер каждые 300ms (0.3 секунды)
end;

procedure OnDestroy;
begin
gSys.SetTimer(1,0); // останавливаем таймер 1
gSys.SetTimer(2,0); // останавливаем таймер 2
end;

function OnTimer(nt,cnt : integer) : boolean;
begin
result := true;
writelogln(format('таймер %d вызвался %d-й раз',[nt,cnt]));
end;


begin
// тут тело скрипта.
end.