Главная страница
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.047 c
1-1137030303
Kolya
2006-01-12 04:45
2006.02.12
Загрузка плейлистов


2-1138094394
V0va
2006-01-24 12:19
2006.02.12
удаление строк из списка


15-1137908295
Skorpion-555
2006-01-22 08:38
2006.02.12
Помогите


5-1124352966
Stanislav
2005-08-18 12:16
2006.02.12
В Наследнике TScrollBox периписать процедуру скроллинга


2-1138113505
Валерия
2006-01-24 17:38
2006.02.12
Как правильно инициализировать массив байт?