Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите сделать напоминалку [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

:)


Наверх

Титульная страница Поиск, карта сайта Написать письмо