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

Вниз

Ужасно ли использование таймера   Найти похожие ветки 

 
MRAk ©   (2007-07-14 16:09) [0]

Вообщем надо чтобы в определенное время сработало событие, правильно ли использовать такой подход:
интервал таймера 60 сек:

procedure TForm1.Timer2Timer(Sender: TObject);
var
tmp:Shortint;
begin
{тут высчитывается tmp относительно AM или PM}
if copy(timetostr(time),0,4)=inttostr((tmp*12)+uptime.h)+":"+inttostr(uptime.m1)+inttostr(uptime.m2) then
begin
...
end
end.

где Uptime.h - часы Uptime.m1 - первое число минут Uptime.m2 - второе число минут
Возможно ли скажем из за того что процессор будет загружен пропуск события?


 
Zagaevskiy ©   (2007-07-14 16:18) [1]

Ужас. Это как он должен быть загружен?


 
MRAk ©   (2007-07-14 16:28) [2]

ну хрен знает скажем если таймер был запущен в 59,9 секунд то небольшая задержка можети перебросить на сл минуту я вот что думаю. а если не так то как лучше проверять?


 
Zagaevskiy ©   (2007-07-14 16:38) [3]


> ну хрен знает скажем если таймер был запущен в 59,9 секунд
> то небольшая задержка можети перебросить на сл минуту я
> вот что думаю. а если не так то как лучше проверять?

А тебе это зачем? Обрисуй задачу


 
MRAk ©   (2007-07-14 16:46) [4]

вообщем что то типа будильника, с того момента как пользователь нажмет запуск, программа ждет пока не наступит указанное пользователем время. таймер начинает работать в тот момент как пользователь нажмет кнопку, можно канешно дождатся сл минуты и с 1 секунды начать отмерять.
в двух словах пишу злой будильник для себя, в котором пока не решишь парочку простых задач он не затыкается и закрыть его незя.


 
Zagaevskiy ©   (2007-07-14 16:49) [5]


> пока не решишь парочку простых задач

Это как замеряться будет?

Сила есть, воля есть, а силы воли нет! (с) "Хочу в тюрьму"


 
{RASkov} ©   (2007-07-14 16:51) [6]

> [4] MRAk ©   (14.07.07 16:46)
> в котором пока не решишь парочку простых задач он не затыкается
> и закрыть его незя.

Не боишься лишиться компа или монитора хотя бы? :))


> if copy(timetostr(time),0,4)=inttostr((tmp*12)+uptime.h)
> +":"+inttostr(uptime.m1)+inttostr(uptime.m2)

Зачем тебе строки? У тебя же есть время и время срабатывания..... с числами проще работать, чем со строками...


 
Gydvin ©   (2007-07-14 16:52) [7]

Мх а "посмотреть" системное время, запомнить, и при наступление "нужного" времени активировать будильник?


> в двух словах пишу злой будильник для себя, в котором пока
> не решишь парочку простых задач он не затыкается и закрыть
> его незя.

Альт контрол дел спасут отца русской демократии )) или резет ))


 
Zagaevskiy ©   (2007-07-14 16:53) [8]

А поставь интервал 1 мс тогда нормально будет.

А если для себя, то вообще такая точность не важна.

И обмануть самого себя можно.

Поставь другой таймер и пусть та самая кнопка нажимается 1 раз в час -это будет реально


 
Zagaevskiy ©   (2007-07-14 16:54) [9]


> Альт контрол дел спасут отца русской демократии )) или резет
> ))

DisableTaskMgr


 
Zagaevskiy ©   (2007-07-14 16:55) [10]


> или резет ))

Прогу в автозапуск


 
Инс ©   (2007-07-14 16:56) [11]


> [4] MRAk ©   (14.07.07 16:46)


Почитай про ожидаемые таймеры (Waitable Timers). Это объекты ядра. Они позволяют задать абсолютное воемя срабатывания, также могут вывести систему из спящего режима, и много чего другого.
У Рихтера, например, можно почитать:
http://wm-help.net/books-online/book/59464/59464-28.html#h9t4


 
MRAk ©   (2007-07-14 16:56) [12]

ну вообщем када нажимаешь кнопку "Решать" будильник затыкается гдето минуты на 2, точно я еще не решил сколько, и генерирует такие задачки:
1) сложить 2 случайных 2х значных числа
2) умножить random(8)+1 на random(19)+1
3) решить простенькую логическую оперцаю из серии и или(этот пункт пока делать не буду)
4) переписать случайно сгененированное слово, вернее набор символов.
в случае ошибки в одном из примеров заново дается примерно 2 минуты и генерируется все задания заново, а в случае если ты не успеваешь в эти 2 минуты уложится он выставляет громкость в винде на макс(это уже сделал) отключает mute на всяк(тока хз как это сделать пока) и запускает обратно мелодию, так что спать будет не резон


 
Инс ©   (2007-07-14 16:57) [13]


> А поставь интервал 1 мс тогда нормально будет.


Погрешность будет десятки тысяч проценов ;)


 
MRAk ©   (2007-07-14 16:58) [14]

To: Инс спасиб


 
MRAk ©   (2007-07-14 17:00) [15]

хотя отключить можно 2мя способами, это ресет и вырубить колонки =) но я же не себя обманывать, я просто с просони иногда даже не замечаю как отключил будильник.


 
Anatoly Podgoretsky ©   (2007-07-14 17:03) [16]

> MRAk  (14.07.2007 16:09:00)  [0]

Возможно объединение событий таймера, что для тебя будет означать потерю


 
Zagaevskiy ©   (2007-07-14 17:03) [17]


> Погрешность будет десятки тысяч проценов ;)

нафига ему точность.
нажал -> таймер запустился -> интервал 2 минуты -> проверка решения и тд
> запускает обратно мелодию

Колонки вырубить можно
имхо лучше пусть пищит BEEP


 
MRAk ©   (2007-07-14 17:05) [18]

хм а это идея, только тада лучше совместно =)


 
Anatoly Podgoretsky ©   (2007-07-14 17:25) [19]

> MRAk  (14.07.2007 16:56:12)  [12]

Задача два решения не имеет


 
MRAk ©   (2007-07-14 18:09) [20]


> Инс ©   (14.07.07 16:56) [11]

там разобранно для сей, дело в том что
// преобразуем местное время в UTC-время
LocalFileTimeToFilelime(&ttLocal, &ftUTC);

такой функции в дельфи нету. или может какой модуль подключить надо?


 
MRAk ©   (2007-07-14 18:14) [21]

Omfg совсем слепой там же опечатка =) но проблема дальше я немного не понимаю этот участок:
// преобразуем FILETIME в LARGE_INTEGER из-за различий в выравнивании данных
liUTC.LowPart := ftUTC dwLowDateTime;
liUTC.HighPart := ftUTC dwHighDateTime;
во что пишет
 [Error] Unit1.pas(408): Incompatible types: "Cardinal" and "_FILETIME"
 [Error] Unit1.pas(409): Incompatible types: "Integer" and "_FILETIME"


 
Инс ©   (2007-07-14 18:14) [22]

есть, Windows.pas. У вас опечатка просто.
LocalFileTimeToFiletime


 
MRAk ©   (2007-07-14 18:16) [23]

да я вижу а со следующим вопросом?


 
Инс ©   (2007-07-14 18:23) [24]

У меня получилось примерно так:

var
 hTimer: THandle;
 st: _SYSTEMTIME;
 ftLocal, ftUTC: TFileTime;
 liUTC: TLargeInteger;
begin
 hTimer:=CreateWaitableTimer(nil, false, nil);
 st.wYear := 2002; // год
 st.wMonth := 1; // январь
 st.wDayOfWeek := 0; // игнорируется
 st.wDay := 1; // первое число месяца
 st.wHour := 13; // 1 PM
 st.wMinute := 0; // 0 минут
 st.wSecond := 0; // 0 секунд
 st.wMilliseconds := 0; // 0 миллисекунд
 SystemTimeToFileTime(st, ftLocal);
 LocalFileTimeToFiletime(ftLocal,ftUTC);
 ULARGE_INTEGER(liUTC).LowPart:=ftUTC.dwLowDateTime;
 ULARGE_INTEGER(liUTC).HighPart:=ftUTC.dwHighDateTime;
 SetWaitableTimer(hTimer, liUTC, 6 * 60 * 60 * 1000, nil, nil, false);


 
MRAk ©   (2007-07-14 18:30) [25]


> Инс ©   (14.07.07 18:23) [24]

Спасиб огромное я бы не додумался до этих 2х строчек. как напишу будильник в студию?


 
Плохиш ©   (2007-07-14 22:39) [26]


> if copy(timetostr(time),0,4)=inttostr((tmp*12)+uptime.h)+":
> "+inttostr(uptime.m1)+inttostr(uptime.m2) then

Хорошая трава...


 
MRAk ©   (2007-07-15 01:07) [27]


> Плохиш ©   (14.07.07 22:39) [26]

мне просто не хотелось возится с датами или числами. а через строчки это заняло 2 сек =) ниче теперь все сделал по совету Инс через ожидаемые таймеры. теперь даже из спящего режима выводит, и такой гемор не нужен был


 
jaya   (2007-08-01 07:37) [28]

можете поделиться прогой, которая периодически выводит комп из спящего режима, и если возможно то и ее сырцы плиз :)


 
grisme ©   (2007-08-01 11:06) [29]

мм..можно посчитать количество миллисекунд до следующего срабатывания, поставить такой делей на таймер(SetTimer(), KillTImer()) и в обработчике выполнять то, что должен :)


 
Юрий Зотов ©   (2007-08-01 23:19) [30]

MRAk ©   (14.07.07 16:46) [4]

1. Посмотрите Sleep. Весь будильник займет 10 строк и не будет загружать процессор (а таймер все-таки будет).

2. Точного срабатывания не гарантирует ни таймер, ни Sleep, ни все остальное (потому что его не гарантирует сама система). Но если Вас устраивает погрешность в доли секунды, то на это можно не обращать внимания.



Страницы: 1 вся ветка

Текущий архив: 2007.08.26;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.026 c
1-1181888482
JanMihail
2007-06-15 10:21
2007.08.26
Смена иконки папки под Vista


15-1185782087
TStas
2007-07-30 11:54
2007.08.26
Не планируется ли ММП?


15-1185719110
ProgRAMmer Dimonych
2007-07-29 18:25
2007.08.26
PHP+MySQL и SQL-Injection


15-1185940922
IMHO
2007-08-01 08:02
2007.08.26
Бухгалтера vs. программисты


3-1178386569
Razor
2007-05-05 21:36
2007.08.26
Delphi + Mysql5