PDA

Просмотр полной версии : Помогите прикрутить таймер.


afonbka
19.03.2011, 09:57
Всем доброе утро. Давно хотелось написать скрипт, который бы отправлял 3 пакета с задержкой между каждым 1 секунда, и скрипт повторял ето делать каждые 6 минут. Нашел пример скрипта, который будет отправлять пакеты каждые 1 сек, но нужно прикрутить таймер, который бы приводил скрипт в действие каждые 6 минут. Особо благодарен всем, кто хотябы попытается помоч. Вот пример.

const
nik='ник';

var
timer : TTimer;
packet:array of string;
i,j:integer;

procedure OnTimer(Sender: TObject);
begin
for i:=1 to 999 do begin //сколько раз отправлять пакеты
for j:=1 to length(packet) do begin
buf:=packet[j];
sendtoserverex(nik);
end;
end;
end;

procedure Init;
begin
packet[1]:=Hstr('D0 0F 00 D3 04 00 00 91 01 00 00'); // 1 пакет
packet[2]:=Hstr('D0 0F 00 D3 04 00 00 92 01 00 00'); // 2 пакет
packet[3]:=Hstr('D0 00 00 00 00 00'); // 3 пакет.
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=false;
timer.interval:=1000; //время задержки между отправкой пакетов.
j:=1;
i:=1;
end;

procedure Free;
begin
timer.free;
end;

begin
end.

Nickers
19.03.2011, 12:21
Эх... вот создаешь темы, создаешь...

Вот способ с 2мя таймерами:
(Как в 1 уложить хз это думать головой нада)
const
Name='Nickers'; //Ник
N=3; //Сколько раз послать пакет

var
timer, timer2 : TTimer;
j:integer;

procedure OnTimer(Sender: TObject);
begin
buf:= ; //Сюда пакет по типу: "buf:=#$FF#$01#$00#$00#$00;"
SendToServerEx(Name);
inc(j);
if j=N then
begin
timer.enabled:=false;
timer2.enabled:=true;
j:=0;
end;
end;

procedure OnTimer2(Sender: TObject);
begin
timer1.enabled:=true;
timer2.enabled:=false;
end;

procedure Init;
begin
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=true;
timer.interval:=1000; //1 сек

timer2:=TTimer.Create(nil);
timer2.OnTimer:=@OnTimer2;
timer2.enabled:=false;
timer2.interval:=6000; //6 сек
j:=0;
end;

procedure Free;
begin
timer.free;
timer2.free;
end;

begin
end.
Как-то так... Не проверял, ошибки не исключены...
(Прошу выложить способ с 1м таймером, мне будет интересно разобрать)

По вопросам скриптописания добро пожаловать в соответствующую >>>темку (http://goo.gl/jUjfj)<<< (У меня в подписи)

afonbka
19.03.2011, 12:24
Хорошо. Спасибо большое, но как сделать чтобы он отправлял не 1 пакет а 3?

Nickers
19.03.2011, 12:31
const
Name='Nickers'; //Ник
N=3; //Сколько раз послать пакет

var
timer, timer2 : TTimer;
packet:array[1..N] of string;
j:integer;

procedure OnTimer(Sender: TObject);
begin
inc(j);
buf:=packet[j];
SendToServerEx(Name);
if j=N then
begin
timer.enabled:=false;
timer2.enabled:=true;
j:=0;
end;
end;

procedure OnTimer2(Sender: TObject);
begin
timer1.enabled:=true;
timer2.enabled:=false;
end;

procedure Init;
begin
packet[1]:=Hstr('D0 0F 00 D3 04 00 00 91 01 00 00'); // 1 пакет
packet[2]:=Hstr('D0 0F 00 D3 04 00 00 92 01 00 00'); // 2 пакет
packet[3]:=Hstr('D0 00 00 00 00 00'); // 3 пакет.

timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=true;
timer.interval:=1000; //1 сек

timer2:=TTimer.Create(nil);
timer2.OnTimer:=@OnTimer2;
timer2.enabled:=false;
timer2.interval:=6000; //6 сек
j:=0;
end;

procedure Free;
begin
timer.free;
timer2.free;
end;

begin
end.
Вот думаю так тебе нада(При запуске):
ждет секунду, Посылает пакет(1), ждет секунду, ПАКЕТ(2), секунда, Пакет(3), 6 секунд (Повтор)

afonbka
19.03.2011, 13:05
Спасибо большое:)

Добавлено через 26 минут
Извини, но ругается на этот участок кода

procedure OnTimer2(Sender: TObject);
begin
timer1.enabled:=true;
timer2.enabled:=false;
end

Добавлено через 3 минуты
Починил, у тебя в коде в первом случае timer=true а тут timer1=true. стер единичку и все заработало :) Но теперь он отпарвляет ети пакеты лиш 1 раз, а через заданное время во втором таймере он не отпарвляет.

Nickers
19.03.2011, 13:14
Да на счет 1 я лажанул =)))

Попробуй так? А то я хз в чем ошибка)) (Напиши саму ошибку...)
const
Name='Nickers'; //Ник
N=3; //Сколько раз послать пакет

var
timer, timer2 : TTimer;
packet:array[1..N] of string;
j:integer;

procedure OnTimer(Sender: TObject);
begin
timer2.enabled:=false;
inc(j);
buf:=packet[j];
SendToServerEx(Name);
if j=N then
begin
timer2.enabled:=true;
j:=0;
timer.enabled:=false;
end;
end;

procedure OnTimer2(Sender: TObject);
begin
timer.enabled:=true;
end;

procedure Init;
begin
packet[1]:=Hstr('D0 0F 00 D3 04 00 00 91 01 00 00'); // 1 пакет
packet[2]:=Hstr('D0 0F 00 D3 04 00 00 92 01 00 00'); // 2 пакет
packet[3]:=Hstr('D0 00 00 00 00 00'); // 3 пакет.

timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=true;
timer.interval:=1000; //1 сек

timer2:=TTimer.Create(nil);
timer2.OnTimer:=@OnTimer2;
timer2.enabled:=false;
timer2.interval:=6000; //6 сек
j:=0;
end;

procedure Free;
begin
timer.free;
timer2.free;
end;

begin
end.

afonbka
19.03.2011, 13:23
Тоже самое, отсылает 3 пакета 1 раз и больше не отсылает как задано во втором таймере.

timer2:=TTimer.Create(nil);
timer2.OnTimer:=@OnTimer2;
timer2.enabled:=false;
timer2.interval:=15000; //15 сек
j:=0;

Добавлено через 4 минуты
а нет, все работает.. спасибо)) только отсылает он не через 15 секунд как я указал, а рандомно както :((

Добавлено через 2 минуты
указал отсылать с задержкой между пакетами 1.5 сек и повторять эту процедуру каждые 15 сек. он повторил её через 1 - 1.5 минуты.

Nickers
19.03.2011, 13:23
afonbka, Хм эта странно)) Когда тестируешь нада по меньше числа указывать)) Ну мб ща кто-нить зайдет и напишет нам как написать в 1 таймер и чтоб без погрешности)))

dyh9l
19.03.2011, 13:34
думаю как то так

const
name = '';
var
timer:TTimer;
TimerStep:byte;
procedure Init;
begin
TimerStep:=1;
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=true;
timer.interval:=1000; //время задержки между отправкой пакетов.
end;

procedure Free;
begin
timer.free;
end;

procedure OnTimer;
begin
case TimerStep of
1:
begin
timer.interval:=1000;
buf:=Hstr('D0 0F 00 D3 04 00 00 91 01 00 00');
SendToServerEx(name);
// SendMsg('1');
Inc(TimerStep);
end;
2:
begin
buf:=Hstr('D0 0F 00 D3 04 00 00 92 01 00 00');
SendToServerEx(name);
// SendMsg('2');
Inc(TimerStep);
end;
3:
begin
buf:=Hstr('D0 00 00 00 00 00');
SendToServerEx(name);
// SendMsg('3');
TimerStep:=1;
timer.interval:=6*60000; //60000 мс = 1 минута
end;
end;
end;


begin

end.

p.s: вам веть фобос писал статью, как сделать таймер с несколькими пакетами

Nickers
19.03.2011, 13:43
Та я тож думал что так нада было сделать)))
timer.interval:=360000;
А так можно и без Кейса))

afonbka
19.03.2011, 13:44
Спасибо спасибо. Все четко как по маслу работает :)) Спасибо еще раз..

Nickers
19.03.2011, 13:44
6*60000
Чет многа)

afonbka
19.03.2011, 13:58
норм. дансы сонги 6 минут на сервере. кидает пати каждые 364 сек и бд свс варк принимают и бафают :)

dyh9l
19.03.2011, 14:07
рад что смог помочь))
Та я тож думал что так нада было сделать)))

А так можно и без Кейса))
не понял)

Nickers
19.03.2011, 14:18
Ну я про то что прост итервал меняешь и фсио (Никогда так не делал(прост не пробывал))

dyh9l
19.03.2011, 14:47
))))

VLADOS_vdv
13.04.2012, 18:57
У меня такой вопрос. как зделать чтоб вот этот, делал тоже самое только на ВСЕ ники чаров которые забиты в l2phx, без указания.

const
Name='Nickers'; //Ник
N=3; //Сколько раз послать пакет

var
timer, timer2 : TTimer;
packet:array[1..N] of string;
j:integer;

procedure OnTimer(Sender: TObject);
begin
timer2.enabled:=false;
inc(j);
buf:=packet[j];
SendToServerEx(Name);
if j=N then
begin
timer2.enabled:=true;
j:=0;
timer.enabled:=false;
end;
end;

procedure OnTimer2(Sender: TObject);
begin
timer.enabled:=true;
end;

procedure Init;
begin
packet[1]:=Hstr('D0 0F 00 D3 04 00 00 91 01 00 00'); // 1 пакет
packet[2]:=Hstr('D0 0F 00 D3 04 00 00 92 01 00 00'); // 2 пакет
packet[3]:=Hstr('D0 00 00 00 00 00'); // 3 пакет.

timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=true;
timer.interval:=1000; //1 сек

timer2:=TTimer.Create(nil);
timer2.OnTimer:=@OnTimer2;
timer2.enabled:=false;
timer2.interval:=6000; //6 сек
j:=0;
end;

procedure Free;
begin
timer.free;
timer2.free;
end;

begin
end.

NLObP
16.04.2012, 22:16
как зделать чтоб вот этот, делал тоже самое только на ВСЕ ники чаров которые забиты в l2phx, без указания

Использовать команду SendToServer вместо SendToServerEx

VLADOS_vdv
17.04.2012, 22:05
const
Name='Nickers'; //Ник
N=3; //Сколько раз послать пакет
А вот этопросто удалить?

NLObP
18.04.2012, 21:56
Name='Nickers'; //Ник

Это уже не требуется.