Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> класс Timer 
:(
    Опции темы
zss
Дата 25.1.2007, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



нужен был небольшой класс, реализующий таймер
*.h
Код

class Timer : private boost::noncopyable {
private :   
    HANDLE m_hTimer;
    HANDLE m_hTimerQueue;
    HANDLE m_event;
    boost::function <void (void)> m_func;

    static void CALLBACK TimerRoutine (void* arg, BOOL state)
    {
        Timer* timer = static_cast<Timer *> (arg);
        timer->m_func();
        SetEvent(timer->m_event);
    }

public :
    template <class T>
    Timer (T& obj, void (T::*func)(void))
        : m_hTimer (NULL), m_hTimerQueue (NULL),
        m_event (NULL), m_func (boost::bind (func, &obj))
    {
        m_event = CreateEvent(NULL, TRUE, FALSE, NULL);
        if (!m_event)
        {
            throw std::exception("Ошибка создания event");
        }
        m_hTimerQueue = CreateTimerQueue();
        if (!m_hTimerQueue)
        {
            throw std::exception("Ошибка создания очереди таймера");
        }
    }
    ~Timer ();

    bool start (unsigned period, unsigned delay = 0);
    bool stop  (void);
};



*.cpp
Код

Timer::~Timer ()
{
    if (!DeleteTimerQueueEx (m_hTimerQueue, INVALID_HANDLE_VALUE))
    {
        DebugMessage ("Timer::~Timer(DeleteTimerQueueEx)");
    }
    CloseHandle (m_event);

}
bool Timer::start (unsigned period, unsigned delay)
{
    if (m_hTimer) return true;
    if (!CreateTimerQueueTimer (&m_hTimer, m_hTimerQueue,
                                (WAITORTIMERCALLBACK)TimerRoutine,
                                this, delay, period, 0/*WT_EXECUTEONLYONCE*/))
    {
        DebugMessage ("Timer::start (CreateTimerQueueTimer)");
        return false;
    }
    return true;
}
bool Timer::stop (void)
{
    if (!m_hTimer) return true;
    if (!DeleteTimerQueueTimer (m_hTimerQueue, m_hTimer,
                                m_event/*INVALID_HANDLE_VALUE*/))
    {
        DebugMessage ("Timer::stop (DeleteTimerQueueTimer)");
        return false;
    }
    m_hTimer = NULL;
    return true;
}


но иногда либо вообще не могу дождаться его при вызове stop (хотя в TimerRoutine ничего нет что может повесить) 

Что я не так сделал ?
PM MAIL ICQ   Вверх
GIK
Дата 26.1.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


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

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



Как ты вызываешь таймер и откуда?


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
W4FhLF
Дата 26.1.2007, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 20
Всего: 121



Воспользовался бы обычными SetTimer/KillTimer.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
zss
Дата 26.1.2007, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(GIK @  26.1.2007,  22:47 Найти цитируемый пост)
Как ты вызываешь таймер и откуда? 

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


Цитата(W4FhLF @  26.1.2007,  22:57 Найти цитируемый пост)
Воспользовался бы обычными SetTimer/KillTimer. 

а это как ? можно подробнее ?
PM MAIL ICQ   Вверх
Romikgy
Дата 27.1.2007, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(zss @  26.1.2007,  22:39 Найти цитируемый пост)
SetTimer

Цитата

The SetTimer function creates a timer with the specified time-out value. 

UINT SetTimer(

    HWND hWnd,    // handle of window for timer messages
    UINT nIDEvent,    // timer identifier
    UINT uElapse,    // time-out value
    TIMERPROC lpTimerFunc  // address of timer procedure
   );    
 

Parameters

hWnd

Identifies the window to be associated with the timer. This window must be owned by the calling thread. If this parameter is NULL, no window is associated with the timer and the nIDEvent parameter is ignored. 

nIDEvent

Specifies a nonzero timer identifier. If the hWnd parameter is NULL, this parameter is ignored. 

uElapse

Specifies the time-out value, in milliseconds. 

lpTimerFunc

Points to the function to be notified when the time-out value elapses. For more information about the function, see TimerProc. 
If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue. The hwnd member of the message's MSG structure contains the value of the hWnd parameter. 

 

Цитата(zss @  26.1.2007,  22:39 Найти цитируемый пост)
KillTimer

Цитата

The KillTimer function destroys the specified timer. 

BOOL KillTimer(

    HWND hWnd,    // handle of window that installed timer
    UINT uIDEvent  // timer identifier
   );    
 

Parameters

hWnd

Identifies the window associated with the specified timer. This value must be the same as the hWnd value passed to the SetTimer function that created the timer. 

uIDEvent

Specifies the timer to be destroyed. If the window handle passed to SetTimer is valid, this parameter must be the same as the uIDEvent value passed to SetTimer. If the application calls SetTimer with hWnd set to NULL, this parameter must be the timer identifier returned by SetTimer. 

 

 smile 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
zss
Дата 27.1.2007, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а если у меня нет окна smile
PM MAIL ICQ   Вверх
dumb
Дата 27.1.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

Репутация: 8
Всего: 158



Цитата(zss @  27.1.2007,  11:02 Найти цитируемый пост)
а если у меня нет окна

сделай. невидимое.
PM MAIL   Вверх
Romikgy
Дата 27.1.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(zss @  27.1.2007,  10:02 Найти цитируемый пост)
а если у меня нет окна

ну и не надо,

Цитата(Romikgy @  27.1.2007,  00:15 Найти цитируемый пост)
lpTimerFunc

Points to the function to be notified when the time-out value elapses. For more information about the function, see TimerProc. 
If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue. The hwnd member of the message's MSG structure contains the value of the hWnd parameter. 

для чего сделали, ставишь в 
Цитата(Romikgy @  27.1.2007,  00:15 Найти цитируемый пост)
hWnd


Цитата(Romikgy @  27.1.2007,  00:15 Найти цитируемый пост)
If this parameter is NULL, no window is associated with the timer and the nIDEvent parameter is ignored. 

и вперед


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
zss
Дата 28.1.2007, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



что-то я посмотрел в MSDN описание - бред какой-то - все примеры без callback  smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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