![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите сделать напоминалку [D6, WinXP]
novikova © (2006-01-23 08:29:00)Уважаемые Мастера. Помогите сделать программу, которая в определенные моменты времени (заданные заранее) выдавала звуковой сигнал.
Сделала так:
Repeat
If Now = <MyDateTime> then
Begin
//сюда не попадаем!!!
<...>
BEEP;
End;
Until false;
Не работает...
Есть какие-нибудь идеи, пишите или скиньте на мыло, пожалуйста...
zorik (2006-01-24 10:06:00) [1]
> Ega23 © (24.01.06 09:43) [14]
Я так когда-то делал. Ставил интервал таймера 50 с. Задача постоянно висела и в нужное время отправляла сообщения выбраным компам в сети "tea break". Согласен что не идеальный вариант, но работало. Переделать нормально руки не дошли :-)
antonn (2006-01-24 09:55:00) [2]можно одним таймером обойтись.
при запуске определять, какое задание ближайшее, и ставить таймер на это время. при срабатывании проверять, какому заданию соотвествует текущее время. И сразу искать следующиее задание.
так можно и на одно время назначить несколько заданий.
Ega23 (2006-01-24 09:43:00) [3]
> zorik © (24.01.06 09:38) [13]
>
>
Если я сильно грузану процессор другой задачей, то высока вероятность несрабатывания условия if (h=Tasks[i].h) and (m=Tasks[i].m) then
zorik (2006-01-24 09:38:00) [4]
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;
novikova (2006-01-24 08:28:00) [5]Что такое ПУЛ - я не знаю?
Ega23 (2006-01-23 18:51:00) [6]
> А таймеров не хватит - событий у меня может быть до 48 штук
> за 1 день...
> И реализовать это нужно не просто в программе, а в потоке
Ну а в чём проблема-то? Бери и реализовывай. Более того, я бы на твоём месте на каждое задание свой поток бы сделал. И общий пул потоков.
The Sound (2006-01-23 17:53:00) [7]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"
zorik (2006-01-23 17:16:00) [8]Ставиш один таймер с разумным интервалом (в зависимости от задачи - 10 с, 15, 30, 55). Больше 60 с ставить не надо, а то может проскочить если сравнивать время с точностю до минуты. Создаеш масив напоминаний. Напоминание лучше оформить в виде записи: текст напоминания и время. Делаешь редактор напоминаний с возможностю сохранения в файл. В событии таймера сравниваешь текущее время с елементами масива событий. Если условие выполняяется - выдаешь сообщение и бип. Для сравнения времени почитай в справке о DecodeDateTimeа также see also к нему :-)
novikova (2006-01-23 11:57:00) [9]То что абсолютно точно никогда не совпадет, это я давно поняла... Мне нужно сравнивать час и минуту, все.
А таймеров не хватит - событий у меня может быть до 48 штук за 1 день...
И реализовать это нужно не просто в программе, а в потоке
Помогите кто-нибудь...
Ega23 (2006-01-23 11:52:00) [10]На каждое задание создай свой собственный экземпляр таймера.
А по-поводу неподходит: у тебя условие if now = dt then сработает только тогда, кода now будет АБСОЛЮТНО ТОЧНО равно dt. Без всяких "рядом" и "приблизительно".
novikova (2006-01-23 11:43:00) [11]> Поставь if now >= dt then
Это мне не подходит, так как под это условие попадает другое заданное время на текущие сутки (их задано несколько). А мне нужно, чтобы сначала сработало одно время, затем другое и т.д. Ну как это в мобильнике...
Ega23 (2006-01-23 09:19:00) [12]
> if now = dt then
> begin
> //но сюда не попадает программа!!!
> BEEP;
Вероятность попадания сюда программы - исчезающе мала.
Поставь if now >= dt then
kukuikar (2006-01-23 09:04:00) [13]А чем все-таки TTimer не угодил?
novikova (2006-01-23 08:57:00) [14]Как же произвести сравнение даты и времени, чтобы, например, в 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;
Помогите...
ZeroDivide (2006-01-23 08:49:00) [15]А вообще поставь на формочку компонент Timer, а то этот непрерывный цикл у тебя будет грузить процессор под 100%
ZeroDivide (2006-01-23 08:47:00) [16]If Now ><MyDateTime> then
:)