Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
8-1125511130
Galiaf
2005-08-31 21:58
2006.02.12
Глубина в OpenGl.


2-1137870230
Dead.MorozZ
2006-01-21 22:03
2006.02.12
Бегущая строка


2-1138016256
Стелс
2006-01-23 14:37
2006.02.12
Считывание системного времени в формат TDateTime


15-1137946202
Cerberus
2006-01-22 19:10
2006.02.12
Чья фраза?


2-1138199118
Дмитрий_К
2006-01-25 17:25
2006.02.12
DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский