Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Timer+???

Автор: dark0ut 18.03.2003 18:28

Подскажите реализацию следуюшего алгоритма:
нужно чтобы через определенный интервал (например 5-7 минут) последовательно запускались нужные приложения. Например, в 15:00 запустить калькулятор, а в 15:05 - IE. Это должно происходить автоматически. Также нужно, чтобы можно было время устанавливать вручную и выбирать интервал (например 5,10,20 мин и т.д.)

Автор: ___ALex___ 19.03.2003 1:38

ну по таймеру и сдеди за временем в чём проблема -то?

Добавлено (18.03.03 20:41):
либо юзай TTimer либо "ставь" таймер через SetTimer и в процедуре окна обрабатывай сообщение WM_TIMER либо в той же SetTimer можно определить ф-ию таймера...в хелпе всё есть

Автор: Vit 19.03.2003 1:58

Поставь глобальную переменную (j), а на таймер поставь что-то типа (если всего прилрожений 3, если больше то видоизмени код):

Код
inc(j);
Case (j mod 3) of
 0:; {запуск "программы1"}
 1:; {запуск "программы2"}
 2:; {запуск "программы3"}
End;


Добавлено (18.03.03 21:02):
Ага например кладёшь memo на форму, устанавливаешь интервал таймера на нужный интервал, в обработчике таймера пишешь код:

Код
inc(j); // глобальная переменная - описываешь сразу после Uses модуля.
ShellExecute(...,Memo1.lines[j mod Memo1.lines.count],...);


Таким образом будут запускаться все приложения которые написаны в Memo по порядку.

Автор: ___ALex___ 19.03.2003 21:37

to Vit
в твоей реализации надо тип переменной i брать довольно большого размера
для избежания ошибки при переполнении
так лучше
и в case-е ничего не считается...

Код
...
var i: Byte = 0;
...
Inc(i);
case i of
1: "запуск первой проги"
2: "запуск второй проги"
3: begin i := 0; "запуск третьей проги"; end;
end;

Автор: Vit 19.03.2003 23:31

Обычный Integer - до 2х миллиардов - т.е. даже если таймер поставить на самый маленький возможный интервал в 10 ms то его хватит на год... Ставить разрядность меньшую чем Integer не следует, так как процессор всё равно будет работать с Integer, а вот код из-за преобразований будет менее оптимальным. А так как автор хочет иметь интервал 5 минут, то переменной хватит на 19000 лет....

Автор: ___ALex___ 20.03.2003 1:21

таймер же "тикает" приближённо каждые 55 миллисекунд ведь установка интервала таймера в меньшую величину ведь ничего не даст!?

Автор: Vit 20.03.2003 2:30

Цитата
таймер же "тикает" приближённо каждые 55 миллисекунд ведь установка интервала таймера в меньшую величину ведь ничего не даст!?


Хрен его знает! Но меньше 10 миллисекунд точно не имеет значения, меньше 100 миллисекунд будет врать безбожно, а на более больших интервалах погрешность будет в перделах разумного. Впрочем топик не об этом.

Автор: mj 23.04.2003 4:16

Цитата
Хрен его знает! Но меньше 10 миллисекунд точно не имеет значения, меньше 100 миллисекунд будет врать безбожно, а на более больших интервалах погрешность будет в перделах разумного. Впрочем топик не об этом.

Невыдержал, решил проверить...
За 10 минут погрешность таймеров
в 1 сек - менее 0.01%
в 0.01 сек - менее 1%

для проверки использовался код:

### 1 ###

Код
var
 T1, T2, T3: Integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
 T1 := GetTickCount;
 T2 := 0;
 T3 := 0;
 Timer1.Enabled := True; {1}
 Timer2.Enabled := True; {1000}
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Inc(T2, 10);
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
 Inc(T3, 1000);
end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
 Label1.Caption := IntToStr(GetTickCount-T1);
 Label2.Caption := IntToStr(T2);
 Label3.Caption := IntToStr(T3);
end;


### 2 ###

Код
var
 T1, T2, T3: Integer;
 Mas: array[0..999] of Integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
 T1 := 0;
 T2 := GetTickCount;
 Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 T3 := GetTickCount;
 Mas[T1] := T3-T2;
 T2 := T3;
 Inc(T1, 1);
 if T1>999 then
 begin
   Timer1.Enabled := False;
   for T1 := 0 to 999 do
     Memo1.Lines.Add(IntToStr(Mas[T1]));
 end;
end;