![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ужасно ли использование таймера [D7, XP]
MRAk © (2007-07-14 16:09:00)Вообщем надо чтобы в определенное время сработало событие, правильно ли использовать такой подход:
интервал таймера 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 - второе число минут
Возможно ли скажем из за того что процессор будет загружен пропуск события?
Юрий Зотов (2007-08-01 23:19:00) [1]MRAk © (14.07.07 16:46) [4]
1. Посмотрите Sleep. Весь будильник займет 10 строк и не будет загружать процессор (а таймер все-таки будет).
2. Точного срабатывания не гарантирует ни таймер, ни Sleep, ни все остальное (потому что его не гарантирует сама система). Но если Вас устраивает погрешность в доли секунды, то на это можно не обращать внимания.
grisme (2007-08-01 11:06:00) [2]мм..можно посчитать количество миллисекунд до следующего срабатывания, поставить такой делей на таймер(SetTimer(), KillTImer()) и в обработчике выполнять то, что должен :)
jaya (2007-08-01 07:37:00) [3]можете поделиться прогой, которая периодически выводит комп из спящего режима, и если возможно то и ее сырцы плиз :)
MRAk (2007-07-15 01:07:00) [4]
> Плохиш © (14.07.07 22:39) [26]
мне просто не хотелось возится с датами или числами. а через строчки это заняло 2 сек =) ниче теперь все сделал по совету Инс через ожидаемые таймеры. теперь даже из спящего режима выводит, и такой гемор не нужен был
Плохиш (2007-07-14 22:39:00) [5]
> if copy(timetostr(time),0,4)=inttostr((tmp*12)+uptime.h)+':
> '+inttostr(uptime.m1)+inttostr(uptime.m2) then
Хорошая трава...
MRAk (2007-07-14 18:30:00) [6]
> Инс © (14.07.07 18:23) [24]
Спасиб огромное я бы не додумался до этих 2х строчек. как напишу будильник в студию?
Инс (2007-07-14 18:23:00) [7]У меня получилось примерно так:
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:16:00) [8]да я вижу а со следующим вопросом?
Инс (2007-07-14 18:14:00) [9]есть, Windows.pas. У вас опечатка просто.
LocalFileTimeToFile time
MRAk (2007-07-14 18:14:00) [10]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'
MRAk (2007-07-14 18:09:00) [11]
> Инс © (14.07.07 16:56) [11]
там разобранно для сей, дело в том что
// преобразуем местное время в UTC-время
LocalFileTimeToFilelime(&ttLocal, &ftUTC);
такой функции в дельфи нету. или может какой модуль подключить надо?
Anatoly Podgoretsky (2007-07-14 17:25:00) [12]> MRAk (14.07.2007 16:56:12) [12]
Задача два решения не имеет
MRAk (2007-07-14 17:05:00) [13]хм а это идея, только тада лучше совместно =)
Anatoly Podgoretsky (2007-07-14 17:03:00) [14]> MRAk (14.07.2007 16:09:00) [0]
Возможно объединение событий таймера, что для тебя будет означать потерю
Zagaevskiy (2007-07-14 17:03:00) [15]
> Погрешность будет десятки тысяч проценов ;)
нафига ему точность.
нажал -> таймер запустился -> интервал 2 минуты -> проверка решения и тд
> запускает обратно мелодию
Колонки вырубить можно
имхо лучше пусть пищит BEEP
MRAk (2007-07-14 17:00:00) [16]хотя отключить можно 2мя способами, это ресет и вырубить колонки =) но я же не себя обманывать, я просто с просони иногда даже не замечаю как отключил будильник.
MRAk (2007-07-14 16:58:00) [17]To: Инс спасиб
Инс (2007-07-14 16:57:00) [18]
> А поставь интервал 1 мс тогда нормально будет.
Погрешность будет десятки тысяч проценов ;)
MRAk (2007-07-14 16:56:00) [19]ну вообщем када нажимаешь кнопку "Решать" будильник затыкается гдето минуты на 2, точно я еще не решил сколько, и генерирует такие задачки:
1) сложить 2 случайных 2х значных числа
2) умножить random(8)+1 на random(19)+1
3) решить простенькую логическую оперцаю из серии и или(этот пункт пока делать не буду)
4) переписать случайно сгененированное слово, вернее набор символов.
в случае ошибки в одном из примеров заново дается примерно 2 минуты и генерируется все задания заново, а в случае если ты не успеваешь в эти 2 минуты уложится он выставляет громкость в винде на макс(это уже сделал) отключает mute на всяк(тока хз как это сделать пока) и запускает обратно мелодию, так что спать будет не резон
Инс (2007-07-14 16:56:00) [20]
> [4] MRAk © (14.07.07 16:46)
Почитай про ожидаемые таймеры (Waitable Timers). Это объекты ядра. Они позволяют задать абсолютное воемя срабатывания, также могут вывести систему из спящего режима, и много чего другого.
У Рихтера, например, можно почитать:
http://wm-help.net/books-online/book/59464/59464-28.html#h9t4