Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Waitable Timer 
V
    Опции темы
Greeen
Дата 16.3.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 10
Всего: 18



Здравствуйте. Возникла проблема с таймером ожидания. А именно не вызывается callback-функция
Код

VOID CALLBACK TimerProc(LPVOID lpArg, DWORD dwTimerLowValue, DWORD dwTimerHighValue)
{
   MessageBox(0, _T(""), _T(""), 0);
}

HANDLE hTimer = CreateWaitableTimer(NULL, false, _T("TIMER"));
LARGE_INTEGER t;
t.QuadPart = 1000 * (-10000i64);
SetWaitableTimer(hTimer, &t, 0, TimerProc, NULL, false);

Прошу помощи  smile 


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
maxim1000
Дата 16.3.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



а поток в прерываемое состояние входит?
(например, SleepEx)


--------------------
qqq
PM WWW   Вверх
Greeen
Дата 16.3.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 10
Всего: 18



maxim1000, нет  smile 
Уже переделал, создаю таймер в потоке и жду (WaitForSingleObject).
Еще такой вопрос, убивается ли таймер при завершении потока? Например через TerminateThread убью поток, а умрет ли таймер. Никаких глюков не возникнет?


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
maxim1000
Дата 16.3.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



не думаю, надо закрыть его handle
автоматически закрывается он только по завершению процесса, не потока
хотя лучше всё-таки на это не надеяться - спокойнее будет
когда все handl'ы будут закрыты, и объект таймера удалится...

Это сообщение отредактировал(а) maxim1000 - 16.3.2007, 16:03


--------------------
qqq
PM WWW   Вверх
Greeen
Дата 16.3.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 10
Всего: 18



как же мне его закрыть если создается он в потоке.. хэндл можно конечно сохранять, но нужно ли если он сам закрывается при смерти потока  smile 


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
maxim1000
Дата 16.3.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



ну, например, сразу после WaitForSingleObject, если он больше не нужен

Цитата(Greeen @  16.3.2007,  15:18 Найти цитируемый пост)
но нужно ли если он сам закрывается при смерти потока

не... при смерти _процесса_, т.е. если бдут создаваться и удаляться потоки, то таймеры будут накапливаться, так что стоит всё-таки удалить...


--------------------
qqq
PM WWW   Вверх
Greeen
Дата 16.3.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 10
Всего: 18



В том то и дело что поток может быть убит до наступления WaitForSingleObject. Блин, придется значит ручками эти таймеры апстенку  smile 
Спасибо maxim1000


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
maxim1000
Дата 16.3.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



ну, на самом деле, можно удалять таймер и в другом потоке
сделать что-нибудь типа глобальной переменной и удалять в главном потоке, когда другой поток удалится

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


Цитата(Greeen @  16.3.2007,  15:30 Найти цитируемый пост)
поток может быть убит до наступления WaitForSingleObject

до начала или завершения?
если до начала, то можно придвинуть CreateWaitableTimer вплотную к WaitForSingleObject
если поток может завершиться между началом и концом WaitForSingleObject, то тут надо уже конкретнее посмотреть - возможно, получится немного изменить схему работы...


--------------------
qqq
PM WWW   Вверх
Greeen
Дата 16.3.2007, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 10
Всего: 18



Скорее всего придется 
Цитата(maxim1000 @  16.3.2007,  17:48 Найти цитируемый пост)
немного изменить схему работы... 

Thanks



--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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