| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > будильник на API |
| Автор: Dmitry_177 20.10.2006, 11:27 | ||
Хочу сделать будильник на API, используя функции CreateWaitableTimer и SystemTimeToFileTime. Т.к. в них нельзя задать определенное время, например в 18:00 чтобы прозвенел, нужно при установке таймера посчитать разницу между 18:00 и системным временем, и поставить этот интервал, чтобы через такой момент времени сработал будильник... Помогите пожалуйста с реализацией
|
| Автор: Romikgy 20.10.2006, 13:38 | ||
почему?
|
| Автор: Dmitry_177 20.10.2006, 15:10 | ||
а вот так нельзя сделать?
только если честно не очень понятно как он должен сработать? толи callback функция должна быть, толи поток создать толи еще что? |
| Автор: Romikgy 20.10.2006, 16:07 | ||
имхо если положитнльно значит время абсалютно , если открицательно значит относительно и имхо надо задать не только час срабатывания но и день месяц и т.д. |
| Автор: Dmitry_177 20.10.2006, 23:21 |
| А как мне всетаки узнать в какой момент это сработает? |
| Автор: maxim1000 20.10.2006, 23:55 | ||
т.к. таймер waitable (т.е. ожидаемый), то его надо ожидать советую посмотреть помощь по WaitForSingleObject и её родственникам |
| Автор: Snowy 21.10.2006, 11:58 |
| Книжку Рихтера в руки 2 раза в день и все вопросы сами отвалятся. Там расписано всё и очень подробно. |
| Автор: Dmitry_177 21.10.2006, 16:01 | ||
Посмотрите пожалуйста код, правильно ли он реализован? Вроде все работает, но правильно ли я закрываю хендл hTimer, а когда закрывать хендл hThread не знаю... Подскажите пожалуйста...
|
| Автор: maxim1000 21.10.2006, 17:02 |
| когда основной поток доходит до CloseHandle, ожидающий поток всё ещё работает (точнее, ожидает) HANDLE закрывать надо когда его уже никто не использует в разных случаях могут получаться довольно сложные ситуации, но в данном всё просто: достаточно закрыть его в конце WaitThread |
| Автор: Dmitry_177 22.10.2006, 04:11 | ||
А вот так правильно будет? оба хендла (hTimer и hThread) закрываю в функции WaitThread после WaitForSingleObject. А если выключить программу (нажав на крестик) до срабатывания таймера, удалятся эти хендлы или их лучше в событии разрушения формы их удалять?
|
| Автор: maxim1000 22.10.2006, 10:52 | ||
т.е. (ИМХО) дескриптор потока можно закрывать сразу после CreateThread, если он не нужен да и вообще, дескриптор нигде больше не будет использоваться, его закрывают в случае таких объектов, как таймер, событие, к которым доступ производится только по дескрипторам, после удаления всех дескрипторов они удаляются а поток имеет ещё одного "пользователя" - собственно, сам поток, который выполняется поэтому даже если все дескрипторы позакрывать, он будет выполняться, пока не закончится его основная функция |
| Автор: Dmitry_177 22.10.2006, 17:16 |
| Спасибо, вы очень добры.. Если будет такая ситуация, ставим мы будильник на 18:00, а время будет уже больше 18:00, часов (19, 20, 21, 22, 23 например).. так вот день в sysTime, будет сегодняшний, а сработать таймер должен завтра, т.к. сегодня 18 часов уже было... Вот как прибавить к дате один день, с учетом того, что если день будет последним в текущем месяце, то 1-ый день будет следующего месяца, так же и с годом, если последний день года, т.е. 31 декабря... |
| Автор: Romikgy 22.10.2006, 17:32 | ||||
для работы переодически есть параметр
там время представленно в in 100 nanosecond intervals т.е. добавь кол-во интервалов в сутках к дате сейчас и получишь слудующий день |
| Автор: Dmitry_177 22.10.2006, 17:55 | ||
А так правильно будет?
|
| Автор: Romikgy 22.10.2006, 18:47 | ||
имхо не совсем, корректнее будет так
|
| Автор: Dmitry_177 23.10.2006, 00:16 |
| Работает ))) только если честно не пойму как это работает...((( |
| Автор: Romikgy 23.10.2006, 08:59 |
этот тип представляет собой 8 байтное целое число , в котором представленна дата в 0,1 мкс интервалах , т.е. 1 сутки это 24часа*60мин*60сек*1000мс*1000мкс*10( 10 это потому что 0,1) для перевода лучше юзать типа юнионов в си |