| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Ещё один вопрос по SetWaitabletimer |
| Автор: takedo 23.12.2005, 08:52 | ||
Не могу понять, если задать 0. Что это будет означать? Или лучше вместо нуля задавать -1, что будет значить - через 100 наносекунд? |
| Автор: _hunter 23.12.2005, 11:14 |
| так а тебе что нужно? 0 он и в африке 0. 1 -- 100 нс. |
| Автор: takedo 23.12.2005, 11:19 |
| мне надо, чтобы таймер срабатывал в ровные часы. при вызове SetWaitableTimer я хочу смотреть, сколько времени осталось до времени "х" и его устанавливать в этом параметре. Но вот если я попаду именно на то самое время, когда дельта будет равна нулю и передам 0, что тогда? Ведь как я понимаю, только отрицательное значение говорит о том, через какое время таймер сработает в первый раз. А при положительном мы задаем конкретное время. Далее, при взведении таймера снова SetWaitabletimer....(это я так, что бы не было лишних вопросов) |
| Автор: Romikgy 23.12.2005, 11:21 | ||||
|
| Автор: takedo 23.12.2005, 11:22 |
| Romikgy не понял... |
| Автор: Romikgy 23.12.2005, 11:28 |
| Тип LONG это беззнаковый, как туда можно -1 засунуть? |
| Автор: takedo 23.12.2005, 11:29 | ||
| Romikgy понял, но я не вижу возможности вообще его использовать(см. топик про спящий режим), буду при каждом взведении таймера задавать его параметры заново. Добавлено @ 11:30
Я про const LARGE_INTEGER* pDueTime спрашиваю Добавлено @ 11:31 и в первом сообщении - выдержка из мсдн |
| Автор: _hunter 23.12.2005, 11:33 |
| Romikgy, он про const LARGE_INTEGER* pDueTime говорил а не про LONG lPeriod takedo, если ты попадеш именно на то время -- зачем тебе таймер запускать? сразу код выполняй... |
| Автор: takedo 23.12.2005, 11:37 |
| я жду событие в другом потоке, а значит вроде бы как надо все таки таймер взвести |
| Автор: Romikgy 23.12.2005, 11:42 | ||
Это указатель на структуру FILETIME, в которой ты мож указать время срабатывания твоего таймера, т.е. поставить допустим на 1 декабря 2031 года, и если комп будет включен , то таймер перейдет в сигнальное состояние, и далее будет переводится в сигнальное состояние каждые
Добавлено @ 11:43 Имхо я так понял |
| Автор: takedo 23.12.2005, 11:45 |
| да правильно ты понял, но FILETIME - передавать - большая ошибка(из Рихтера), я спрашиваю про 0. Вот попробую я сейча 0 поставить... Добавлено @ 11:47 да вроде бы прилетел сразу в обработчик(туда-куда нужно). Но ноль ведь это не отрицательное все-таки число, млин!!! Надо было сразу проверить, только внимание привлек, сорри. |
| Автор: _hunter 23.12.2005, 12:09 |
| но и не положительное |
| Автор: takedo 23.12.2005, 12:46 | ||
_hunter
|
| Автор: Earnest 23.12.2005, 18:08 |
| Чтобы сработал сразу - нужно устанавливать 0, если установить -1 (или любое отрицательное число эквивалентное задержке до ~10 мс), сработает через 10 мс, хотя и устанавливается вроде с дискретностью 100 нс. Короче, реальная дискретность его ~10 мс. Т.е. это вам не performance counter, а обычный системный таймер. |
| Автор: takedo 26.12.2005, 11:37 |
| Earnest От куда такая прескорбная информация? |
| Автор: Earnest 27.12.2005, 09:46 |
| Нарвалась, оттуда и информация. Когда прочла про WaitableTimer с наносекундным временем, обрадовалась. Мне нужно было регулировать скорость некоторого визуального процесса, и я решила что WaitableTimer идеально подходит: заводим таймер, выполняем шаг, до звонка курим, потом опять шаг и курим и т.д. - все в потоке, конечно - и звучит и реализуется элементарно. Только вот не проверила сразу диапазон доступной скорости в релизе. В дебаге верхний предел скорости был низковат, но я решила - там же море всякой фигни лишней + грешила на другие лишние операции. Когда пришло время таки разобраться со скоростью - выяснилось - не звонит он чаще, чем раз в 10 ms, хоть тресни. Или сразу срабатывает (если dueTime=0). Я его и так и этак (очень не хотелось переписывать), MSDN перерыла - ни слова не нашла. Провела измерения (не спрашивай какие - не помню уже - какой-то тест нарисовала), убедилась: увы. Если хорошенько подумать - это, наверно, очевидно для железячников: 100 Гц системный таймер... Но так хотелось... |
| Автор: takedo 27.12.2005, 11:41 |
| Да, походу дела размечтались Но так хотелось, это уж точно, но 10 ms - это за сто обращений - набежит 1 секунда!! Жуть... А где интересно этот таймер "крутится"? Надо наверное попытаться ему приоритет поднять обязательно. Добавлено @ 11:42 там же где и все он крутится?.. ммддааа.. Добавлено @ 11:44 Вот интересно, если запустить два идентичных процесса, в каждом по такому таймеру. Одному процессу поставить приоритет RealTime. Как тогда таймеры будут работать? (хоть бери и пробуй ей богу). Нет мыслей случайно? |
| Автор: Earnest 27.12.2005, 11:47 |
| Знаешь, я выкрутилась так: просто собрала шаги в пакеты. Из заданной скорости вычисляю нужный период таймера (10, 20 и т.д. мс) и число шагов в пакете. Дальше - как и было: выполняется нужное число шагов, потом курим до звонка. Так что минимальными изменениями обошлась. |
| Автор: takedo 27.12.2005, 11:54 |
| ну у тебя возможно так, а в принципе то надо бы как-то это решать по другому.. Надо брать товарища Рихтера, смотреть кому же принадлежит таймер(все-таки можно наверное с приоритетом потока, которому принадлежит таймер поиграть!). Ну если накопаю чего или тесты проведу, создам опять таки "интересное замечание" |
| Автор: takedo 27.12.2005, 12:13 | ||
Earnest c 10 ms тебе просто повезло! |
| Автор: Earnest 27.12.2005, 12:41 |
| Я думаю, просто сейчас процессоры немного чаще это делать стали. Раньше системный таймер кажется именно 50 Гц был. Книжка-то старая - ей уж лет 10... И не думаю, что он все поправил под современное состояние дел. |