Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1185996421
Мануха
2007-08-01 23:27
2007.08.26
chart


2-1186173219
Johnnnn
2007-08-04 00:33
2007.08.26
Как прекратить выполнение кода?


15-1185367285
иннокентий
2007-07-25 16:41
2007.08.26
ие глючит


15-1185309114
Dr. Andrew
2007-07-25 00:31
2007.08.26
Как прервать инсталляцию в Inno Setup до распаковки файлов?


15-1185875690
AZIZE
2007-07-31 13:54
2007.08.26
Интернет





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский