Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: WaitableTimer (В ЧЕМ ОШИБКА :dontknow:)  (Прочитано 7185 раз)
0 Пользователей и 1 Гость смотрят эту тему.
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« : 18-07-2013 08:42 » 

Выставляю таймер
Код:
#define _PERIOD 60*1000L
#define _ONE_HOUR_FT 60*60*10000000ULL

VOID CALLBACK TimerAPCProc (  void * lpArg, DWORD dwTimerLowValue,DWORD dwTimerHighValue)
{
Address * Request=(Address*)lpArg;

SetEvent(Request->hEvent);
}



HANDLE StartMainTimer (Address * Request)
{
SYSTEMTIME st={0};
LONGLONG ft={0};
LONGLONG ft_UTC={0};
HANDLE ret=INVALID_HANDLE_VALUE;

 ret=CreateWaitableTimer(NULL,FALSE,  NULL);
GetLocalTime(&st);
st.wMinute=0;
st.wSecond=0;
st.wMilliseconds=0;
SystemTimeToFileTime(&st,(FILETIME*)&ft);
ft += _ONE_HOUR_FT;
LocalFileTimeToFileTime((FILETIME*)&ft,(FILETIME*)&ft_UTC);
SetWaitableTimer(ret,  (LARGE_INTEGER*)&ft_UTC, _PERIOD,TimerAPCProc,Request,TRUE);

return ret;
}
 
Не работает: если я использую абсолютное время,если использую относительное (ft_UTC отрицательное) или ft_UTC =0 все работает.
В чем ошибка.  

« Последнее редактирование: 18-07-2013 12:24 от LemmonRus » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 18-07-2013 12:19 » 

LemmonRus, а что тебе надо? Только конкретно. Какую задачу решаешь?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #2 : 18-07-2013 12:26 » 

LemmonRus, а что тебе надо? Только конкретно. Какую задачу решаешь?
Есть основной поток с таймером.
Есть дополнительный поток с Wait функцией.Мне нужно чтоб этот чертов таймер начинал отсчитывать каждую минуту с начала следующего часа.
Если пытаюсь использовать относительное время(ft_UTC отрицательное) или начать сразу (значение стартового времени (ft_UTC) 0) таймер подает сигналы
(через HANDLE таймера), но стоит задать ему начало следующего часа ((LARGE_INTEGER*) &ft_UTC) не работает вообще  Да что ты говоришь?.. .
« Последнее редактирование: 18-07-2013 12:34 от LemmonRus » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 18-07-2013 16:13 » 

LemmonRus, не очень понятно, когда таймер останавливается.

В любом случае абсолютное время - календарное, а относительное - интервал вперёд от текущего момента. Если ты неправильно вычислил календарное время, то событие запуска таймера не наступает. Аргумент принимает значение в количестве тиков (100-наносекундных).

А вообще лучше запустить таймер на непрерывную работу и потом уже управлять обработчиком события при помощи автомата: когда учитывать, когда игнорировать, когда включать обработку, когда пропускать.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #4 : 19-07-2013 09:34 » 

LemmonRus, не очень понятно, когда таймер останавливается.

В любом случае абсолютное время - календарное, а относительное - интервал вперёд от текущего момента. Если ты неправильно вычислил календарное время, то событие запуска таймера не наступает. Аргумент принимает значение в количестве тиков (100-наносекундных).

А вообще лучше запустить таймер на непрерывную работу и потом уже управлять обработчиком события при помощи автомата: когда учитывать, когда игнорировать, когда включать обработку, когда пропускать.
LemmonRus, не очень понятно, когда таймер останавливается.

В любом случае абсолютное время - календарное, а относительное - интервал вперёд от текущего момента. Если ты неправильно вычислил календарное время, то событие запуска таймера не наступает. Аргумент принимает значение в количестве тиков (100-наносекундных).

А вообще лучше запустить таймер на непрерывную работу и потом уже управлять обработчиком события при помощи автомата: когда учитывать, когда игнорировать, когда включать обработку, когда пропускать.
Он не останавливается ,он периодический Улыбаюсь CreateWaitableTimer(NULL,FALSE,  NULL);
В том то и дело календарное время выставляется правильно причем с большим запасом.
Проблема в том что таймер с абсолютным временем тупо, не работает.
У меня функция ожидания реализована именно таким образом.
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #5 : 19-07-2013 09:44 » 

LemmonRus, прошу прощения, но по-моему Вы используете не ту функцию, Вы получаете время GelLocalTime(), а потом, преобразуете в системное время SystemTimeToFileTime(), а надо, наверное, ещё дополнительно использовать LocalFileTimeToFileTime(), а так, возможно, вы устанавливаете время срабатывания не учитывая временную зону (ну или наоборот, учитывая дважды, смотря как там внутри оно реализовано).

или просто перейти на использование системного времени (получать время GetSystemTime()) и его преобразовывать, как это делаете Вы, либо вообще - получать время сразу в нужном виде: GetSystemTimeAsFileTime()
« Последнее редактирование: 19-07-2013 09:49 от darkelf » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines