Автор: 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;