Форум: "Начинающим";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];
ВнизПомогите сделать напоминалку Найти похожие ветки
← →
novikova (2006-01-23 08:29) [0]Уважаемые Мастера. Помогите сделать программу, которая в определенные моменты времени (заданные заранее) выдавала звуковой сигнал.
Сделала так:
Repeat
If Now = <MyDateTime> then
Begin
//сюда не попадаем!!!
<...>
BEEP;
End;
Until false;
Не работает...
Есть какие-нибудь идеи, пишите или скиньте на мыло, пожалуйста...
← →
ZeroDivide © (2006-01-23 08:47) [1]If Now > <MyDateTime> then
:)
← →
ZeroDivide © (2006-01-23 08:49) [2]А вообще поставь на формочку компонент Timer, а то этот непрерывный цикл у тебя будет грузить процессор под 100%
← →
novikova (2006-01-23 08:57) [3]Как же произвести сравнение даты и времени, чтобы, например, в 12:00 сработал сигнал BEEP. Только используя TTimer? А если таких времен несколько (например, в 14:00 и в 20:00).
А в примере вот как сделано:
...
var
dt:tdatetime;
...
dt:=encodedate(2006,1,23)+encodetime(12,0,0,0);
repeat
sleep(1);//чтобы не напрягать процессор
if now = dt then
begin
//но сюда не попадает программа!!!
BEEP;
end;
until false;
Помогите...
← →
kukuikar © (2006-01-23 09:04) [4]А чем все-таки TTimer не угодил?
← →
Ega23 © (2006-01-23 09:19) [5]
> if now = dt then
> begin
> //но сюда не попадает программа!!!
> BEEP;
Вероятность попадания сюда программы - исчезающе мала.
Поставь if now >= dt then
← →
novikova (2006-01-23 11:43) [6]> Поставь if now >= dt then
Это мне не подходит, так как под это условие попадает другое заданное время на текущие сутки (их задано несколько). А мне нужно, чтобы сначала сработало одно время, затем другое и т.д. Ну как это в мобильнике...
← →
Ega23 © (2006-01-23 11:52) [7]На каждое задание создай свой собственный экземпляр таймера.
А по-поводу неподходит: у тебя условие if now = dt then сработает только тогда, кода now будет АБСОЛЮТНО ТОЧНО равно dt. Без всяких "рядом" и "приблизительно".
← →
novikova (2006-01-23 11:57) [8]То что абсолютно точно никогда не совпадет, это я давно поняла... Мне нужно сравнивать час и минуту, все.
А таймеров не хватит - событий у меня может быть до 48 штук за 1 день...
И реализовать это нужно не просто в программе, а в потоке
Помогите кто-нибудь...
← →
zorik © (2006-01-23 17:16) [9]Ставиш один таймер с разумным интервалом (в зависимости от задачи - 10 с, 15, 30, 55). Больше 60 с ставить не надо, а то может проскочить если сравнивать время с точностю до минуты. Создаеш масив напоминаний. Напоминание лучше оформить в виде записи: текст напоминания и время. Делаешь редактор напоминаний с возможностю сохранения в файл. В событии таймера сравниваешь текущее время с елементами масива событий. Если условие выполняяется - выдаешь сообщение и бип. Для сравнения времени почитай в справке о DecodeDateTime а также see also к нему :-)
← →
The Sound © (2006-01-23 17:53) [10]procedure TForm1.Timer1Timer(Sender: TObject);
var ttd, yourtime: string;
begin
TimeSeparator := ":";
ttd := TimeToStr(Time);
If yourtime = ttd then beep;;
end;
Перед Timer1.Enabled := True; , заполни переменную yourtime, например "12:00:00"
← →
Ega23 © (2006-01-23 18:51) [11]
> А таймеров не хватит - событий у меня может быть до 48 штук
> за 1 день...
> И реализовать это нужно не просто в программе, а в потоке
Ну а в чём проблема-то? Бери и реализовывай. Более того, я бы на твоём месте на каждое задание свой поток бы сделал. И общий пул потоков.
← →
novikova (2006-01-24 08:28) [12]Что такое ПУЛ - я не знаю?
← →
zorik © (2006-01-24 09:38) [13]
type
TTask = record
Text: String;
h: Integer; //часы
m: Integer; //минуты
end;
TTasks = array of TTime;
var
Tasks: TTasks;
procedure AddTask(const h, m: Integer; text: String);
var
n: Integer;
begin
n := Length(Tasks);
SetLength(Tasks, n + 1);
Tasks[n].h := h;
Tasks[n].m := m;
Tasks[n].Text := text;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
CT: TTime;
h, m, s, ms: Word;
i, n: Integer;
begin
CT := Time;
DecodeTime(CT, h, m, s, ms);
n := Length(Tasks);
for i := 0 to n - 1 do
if (h=Tasks[i].h) and (m=Tasks[i].m) then
begin
Beep;
ShowMessage(Tasks[i].Text);
Break; //чтоб не проходить весь цикл
end;
end;
← →
Ega23 © (2006-01-24 09:43) [14]
> zorik © (24.01.06 09:38) [13]
>
>
Если я сильно грузану процессор другой задачей, то высока вероятность несрабатывания условия if (h=Tasks[i].h) and (m=Tasks[i].m) then
← →
antonn © (2006-01-24 09:55) [15]можно одним таймером обойтись.
при запуске определять, какое задание ближайшее, и ставить таймер на это время. при срабатывании проверять, какому заданию соотвествует текущее время. И сразу искать следующиее задание.
так можно и на одно время назначить несколько заданий.
← →
zorik © (2006-01-24 10:06) [16]
> Ega23 © (24.01.06 09:43) [14]
Я так когда-то делал. Ставил интервал таймера 50 с. Задача постоянно висела и в нужное время отправляла сообщения выбраным компам в сети "tea break". Согласен что не идеальный вариант, но работало. Переделать нормально руки не дошли :-)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.048 c