Форум: "Начинающим";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];
ВнизУжасно ли использование таймера Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.044 c