![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
Доброго времени суток.
Вопрос касается создания ожидаемого таймера. Только вот хотелось бы создать его со сбросом вручную. Делается это наверное так: HANDLE wt = CreateWaitableTimer(0,TRUE,0); А вот дальше задаем параметры через SetWaitableTimer(wt, и т.д.) таймер в определенное время перейдет в свободное состояние. Если бы он был создан как таймер с автосбросом, тогда бы он был занят после вызова ожидающей функции. А в случае ручного сброса он так и останется свободным. Что делать? Либо в случае его взведения снова вызвать SetWaitableTimer, либо CancelWaitableTimer, которая в принципе вызывается при вызове SetWaitableTimer. Но тогда получается, что мы в SetWaitableTimer должны задавать только время первого срабатывания, а периодичность как - бы лишняя. А нет ли функций типа SetEvent ResetEvent, касающихся таймера? Дело в том, что не очень хочется создавать много таймеров и много ожидающих потоков, хотелось бы создать один таймер и много потоков. -------------------- я не гольфист - я хоккеист |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
CancelWaitableTimer не изменяет сигнального состояния (signalled state) таймера... Так что остается только SteWaitableTimer.
Ибо сказано:
Да, насчет периодичности ручного таймера там все как-то мутно. С другой стороны, если тебе надо синхронизовать несколько (больше 2) потоков, кто будет сбрасывать (to unsignalled state) таймер? Как ты узнаешь, что все ждущие его потоки отработали? Если ты знаешь ответ на этот вопрос, заведи ручное событие, которое будет выставляться по автотаймеру. Честно говоря, для этого и обычный оконный таймер сойдет. -------------------- ... |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
Earnest Спасибо за ответ.
Ответов на поставленные тобой вопросы я тоже не знаю, поэтому собственно и тему завел. Да, какая - то муть. Заведу ка я один поток и несколько таймеров! вместо одного таймера и множества потоков - тоже выход. Только таймеры сделаю с автосбросом Добавлено @ 10:00 Все таки не могу не задать вопрос!!!! Если установили таймер на то, чтобы он срабатывал через один час(настроили так, что бы срабатывал в роные часы 21,22,23...). А потом вдруг после того как он сработал, взяли да перевели компьютер в спящий режим, после его снова включили. Когда он взведется? Блин, проверять конечно можно, но это какое -то шаманство. Надо знать не эмпирически, а теоретически. Потому как если таймер взведется в 2:34 - надо делать тогда совсем все по другому. Так когда он взведется после спящего режима? -------------------- я не гольфист - я хоккеист |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
takedo, не знаю. Но думаю, что сразу после выхода из спящего режима...
Даже если где найдется информация об этом, все равно нужно проверить. Програмирование под Windows и есть шаманство - очень много параметров... Насчет твоей задачи. Я бы не заводила много таймеров, особенно если все на одно время, лучше уж много событий. Можно еще посмотреть на QueueTimer или повесить на waitable timer процедуру. Все зависит от задачи: почитай хорошенько MSDN насчет объектов синхронизации, и выбери себе наиболее подходящий для задачи. А еще помни: простые решения всегда лучше сложных. -------------------- ... |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
я вот почему решил завести много таймеров: когда я вызываю WaiForMultipleObjects() она при прочих равных условиях выдаст мне WAITOBJECT_0:. Это хорошо, так как есть разные по приоритету задачи. Но вот если себя переломлю наконец-то, то напишу тестовую программку и усыплю комп!
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Ну если нужно выполнять разные задачи с разной периодичностью, тогда конешно, заводи таймеры. Но если выполняемые задачи занимают ощутимое время, то лучше все же распихать их по разным потокам. И пусть каждый поток сам себе часики заводит (свои), зачем это-то централизовать? Однако, если все же нужна общая синхронизация, то лучше один таймер (с наименьшим кратным периодом) + событие на каждую задачу.
Насчет простых решений: Простое решение - это то, которое по сложности адекватно решаемой задаче. Т.е. не надо гвозди микроскопом. -------------------- ... |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
У меня уже 15 потоков, 7 из которых мои, остальные сами появляются при работе с БД и mp3-проигрывании. Вот и хочу не нагружать систему больше(разве что ещё парочку потоков понадобится, на печать там и на поиск по БД). А сейчас вообще хочу завести секундные таймеры и по срабатыванию смотреть, не настало ли время x в одной ожидающей функции, так как в любом случае, после часа X последует передача данных, которая ведется из одного(ну у меня 2-х, но в каждый момент времени все равно из одного) потока. Вообще то раплодить потоков очень уж не хотелось, но не из-за синхронизации, это я уже прошел(пальцы скрециваем), потеряв в весе весь вес -------------------- я не гольфист - я хоккеист |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |