PDA

Просмотр полной версии : Некорректная работа таймера


Deffol
17.04.2012, 22:30
Приветствую всех.
Давненько не писал скрипты, опять вернулся к этому и сразу столкнулся с проблемой, и, я не понимаю в чем проблема.
Вот собственно скрипт: ( сори забыл как делфи код делать )
var
Timer:TTimer;
Step:byte;
name:string;
procedure Init;
begin
Step:=1;
Timer:=TTimer.Create(nil);
Timer.OnTimer:=@OnTimer;
Timer.enabled:=false;
end;

procedure Free;
begin
Timer.free;
end;

procedure OnTimer(Sender: TObject);
begin
begin
case Step of
1:
begin
buf:=HStr('B2 00 57 71 FF 00 32 00 00 00');
SendToServerEx(name);
Timer.interval:=600;
Inc(Step);
end;
3:
begin
buf:=HStr('B2 00 57 71 FF 00 33 00 00 00');
SendToServerEx(name);
Step:=1;
Timer.enabled:=false;
end;
end;
end;
end;

begin
name:=ConnectName;
if FromClient and (pck[1]=#$B2) and (ReadH(6)=12544) then
Timer.enabled:=true;
end.

Проблема в том, что выполняется только первый Step, а иногда и он не выполняется ( чистый рандом ), второй степ вообще не выполняется.
Есть подозрения, что это из за ConnectName, не могу проверить ибо не знаю как по другому реализовать его, допустим через const если объявить имя соеденения, даже задав имя через SetName, скрипт не включается вообще. Это единственный способ который помог мне включить скрипт.

goodvin1709
17.04.2012, 23:03
procedure OnTimer(Sender: TObject);
begin
begin
case Step of
1:
begin
buf:=HStr('B2 00 57 71 FF 00 32 00 00 00');
SendToServerEx(name);
Timer.interval:=600;
Inc(Step);
end;
3:
begin
buf:=HStr('B2 00 57 71 FF 00 33 00 00 00');
SendToServerEx(name);
Step:=1;
Timer.enabled:=false;
end;
end;
end;
end;
Проблема в том, что выполняется только первый Step, а иногда и он не выполняется ( чистый рандом ), второй степ вообще не выполняется.
Вот смотри ты проверяешь значение степ на 1 и отсылаешь пакет и ставишь степ = 2.
если степ 2 то оно нечего не делает.У тебя проверка только на 1 и 3 нужно добавить 2 или сделать так
procedure OnTimer(Sender: TObject);
begin
begin
case Step of
1:
begin
buf:=HStr('B2 00 57 71 FF 00 32 00 00 00');
SendToServerEx(name);
Timer.interval:=600;
Inc(Step);
end;
2:
begin
buf:=HStr('Второй пакет');
SendToServerEx(name);
Timer.interval:=600;
Inc(Step);
end;
3:
begin
buf:=HStr('B2 00 57 71 FF 00 33 00 00 00');
SendToServerEx(name);
Step:=1;
Timer.enabled:=false;
end;
end;
end;
end;

Deffol
18.04.2012, 01:35
кошмар, спасибо большое :) я в шоке, что не увидел, что у меня вместо второго шага стоит третий...вот балбес, целую тему создал. хотя в любом случае я бы наверно не скоро заметил это. :) спасибо еще раз.
А вот пользуясь случаем хотел бы поинтересоваться, ConnectName нормально я прописал? В смысле не всегда правильно то, что вроде бы работает :) у меня по крайней мере.

Добавлено через 2 часа 16 минут
С этим я разобрался, все таки смог через имя соеденения активировать скрипт по старинке.
Но как ставлю задержки ( интервал времени ), выполняется только первый шаг и последний, второй не выполняется:

const
name='deffol';
var
Timer:TTimer;
StepSkill:byte;

procedure Init;
begin
StepSkill:=1;
Timer:=TTimer.Create(nil);
Timer.OnTimer:=@OnTimer;
Timer.enabled:=false;
end;

procedure Free;
begin
Timer.free;
end;

procedure OnTimer(Sender: TObject);
begin
case StepSkill of
1:
begin
buf:=HStr('пакет');
SendToServerEx(name);
Inc(StepSkill);
timer.interval:=200;
end;
2:
begin
buf:=HStr('пакет');
SendToServerEx(name);
Inc(StepSkill);
timer.interval:=200;
end;
3:
begin
buf:=Hstr('кулёк');
SendToServerEx(name);
Timer.enabled:=false;
StepSkill:=1;
end;
end;
end;

begin
if FromClient and (pck[1]=#$xx) and (ReadH(6)=yy) and (ConnectName=name) then
Timer.enabled:=true;
end.

Пробовал с каждыми действием добавлять шаг, то есть не через Inc(SkillStep), а через SkillStep:=2 ( в первом шаге ), SkillStep:=3 ( во втором ), ну и в третьем возвращать так же как в конце таймера. В этом случае скрипт выполнялся как мне нужно, но всего лишь один раз, после он будто выключался. Подскажите где ошибся :) или опять мб что-то забыл. Без интервала никак :(

J-Fobos
18.04.2012, 20:20
Ну вы же сами выключаете таймер :D

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

Deffol
19.04.2012, 11:59
да, но после шага 3-го, а до него еще 2 шага :) я не нашел ошибок в скрипте сам, думаю дело в интервале, нужен побольше, по крайней мере вроде с бОльшим работает.