Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ожидаемый таймер со сбросом вручную, как работает. 
:(
    Опции темы
takedo
Дата 22.12.2005, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



Доброго времени суток.
Вопрос касается создания ожидаемого таймера. Только вот хотелось бы создать его со сбросом вручную.
Делается это наверное так:
HANDLE wt = CreateWaitableTimer(0,TRUE,0);
А вот дальше задаем параметры через SetWaitableTimer(wt, и т.д.) таймер в определенное время перейдет в свободное состояние. Если бы он был создан как таймер с автосбросом, тогда бы он был занят после вызова ожидающей функции.
А в случае ручного сброса он так и останется свободным. Что делать?
Либо в случае его взведения снова вызвать SetWaitableTimer, либо CancelWaitableTimer, которая в принципе вызывается при вызове SetWaitableTimer. Но тогда получается, что мы в SetWaitableTimer должны задавать только время первого срабатывания, а периодичность как - бы лишняя. А нет ли функций типа SetEvent ResetEvent, касающихся таймера? Дело в том, что не очень хочется создавать много таймеров и много ожидающих потоков, хотелось бы создать один таймер и много потоков.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 22.12.2005, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



CancelWaitableTimer не изменяет сигнального состояния (signalled state) таймера... Так что остается только SteWaitableTimer.
Ибо сказано:
Цитата
manual-reset timer A timer whose state remains signaled until SetWaitableTimer is called to establish a new due time. 

Да, насчет периодичности ручного таймера там все как-то мутно. С другой стороны, если тебе надо синхронизовать несколько (больше 2) потоков, кто будет сбрасывать (to unsignalled state) таймер? Как ты узнаешь, что все ждущие его потоки отработали? Если ты знаешь ответ на этот вопрос, заведи ручное событие, которое будет выставляться по автотаймеру. Честно говоря, для этого и обычный оконный таймер сойдет.


--------------------
...
PM   Вверх
takedo
Дата 22.12.2005, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



Earnest Спасибо за ответ.
Ответов на поставленные тобой вопросы я тоже не знаю, поэтому собственно и тему завел. Да, какая - то муть. Заведу ка я один поток и несколько таймеров! вместо одного таймера и множества потоков - тоже выход. Только таймеры сделаю с автосбросом smile
Добавлено @ 10:00
Все таки не могу не задать вопрос!!!!
Если установили таймер на то, чтобы он срабатывал через один час(настроили так, что бы срабатывал в роные часы 21,22,23...). А потом вдруг после того как он сработал, взяли да перевели компьютер в спящий режим, после его снова включили. Когда он взведется? Блин, проверять конечно можно, но это какое -то шаманство. Надо знать не эмпирически, а теоретически. Потому как если таймер взведется в 2:34 - надо делать тогда совсем все по другому.
Так когда он взведется после спящего режима?


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 22.12.2005, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



takedo, не знаю. Но думаю, что сразу после выхода из спящего режима...
Даже если где найдется информация об этом, все равно нужно проверить.
Програмирование под Windows и есть шаманство - очень много параметров...
Насчет твоей задачи. Я бы не заводила много таймеров, особенно если все на одно время, лучше уж много событий. Можно еще посмотреть на QueueTimer или повесить на waitable timer процедуру. Все зависит от задачи: почитай хорошенько MSDN насчет объектов синхронизации, и выбери себе наиболее подходящий для задачи.
А еще помни: простые решения всегда лучше сложных. smile


--------------------
...
PM   Вверх
takedo
Дата 22.12.2005, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



я вот почему решил завести много таймеров: когда я вызываю WaiForMultipleObjects() она при прочих равных условиях выдаст мне WAITOBJECT_0:. Это хорошо, так как есть разные по приоритету задачи. Но вот если себя переломлю наконец-то, то напишу тестовую программку и усыплю комп! smile А простыми решениями я уже на этой задаче не отделаюсь к сожалению. smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 22.12.2005, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Ну если нужно выполнять разные задачи с разной периодичностью, тогда конешно, заводи таймеры. Но если выполняемые задачи занимают ощутимое время, то лучше все же распихать их по разным потокам. И пусть каждый поток сам себе часики заводит (свои), зачем это-то централизовать? Однако, если все же нужна общая синхронизация, то лучше один таймер (с наименьшим кратным периодом) + событие на каждую задачу.
Насчет простых решений:
Простое решение - это то, которое по сложности адекватно решаемой задаче. Т.е. не надо гвозди микроскопом.


--------------------
...
PM   Вверх
takedo
Дата 22.12.2005, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



Цитата
Ну если нужно выполнять разные задачи с разной периодичностью, тогда конешно, заводи таймеры.

У меня уже 15 потоков, 7 из которых мои, остальные сами появляются при работе с БД и mp3-проигрывании. Вот и хочу не нагружать систему больше(разве что ещё парочку потоков понадобится, на печать там и на поиск по БД). А сейчас вообще хочу завести секундные таймеры и по срабатыванию смотреть, не настало ли время x в одной ожидающей функции, так как в любом случае, после часа X последует передача данных, которая ведется из одного(ну у меня 2-х, но в каждый момент времени все равно из одного) потока. Вообще то раплодить потоков очень уж не хотелось, но не из-за синхронизации, это я уже прошел(пальцы скрециваем), потеряв в весе весь вес smile , а потому, что каждый поток ЖЖЖРЕТ таки ресурсы, а мне в последствии переходить на WinCE и малюсенькие такие(трехдюймовые материнки) с памятью около 64-х мегабайт. Если конечно не впишусь, то будут с большим объемом, но дороже(хотя мне все-равно), вот и хочется ради самоудовлетворения сделать и весело и сердито. smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.