Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.12;
Скачать: CL | DM;

Вниз

Помогите сделать напоминалку   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.06 c
2-1138178193
pathfinder
2006-01-25 11:36
2006.02.12
Непонятная ошибка:(


2-1138104329
K_Lock
2006-01-24 15:05
2006.02.12
Таблица и индексы


3-1134786462
Ольга
2005-12-17 05:27
2006.02.12
Генератор случайных чисел


15-1137685587
Kerk
2006-01-19 18:46
2006.02.12
Просьба покритиковать логотип


15-1137596780
Джо
2006-01-18 18:06
2006.02.12
Цитата