Страницы

Поиск по вопросам

пятница, 9 ноября 2018 г.

CallBack функция как член класса

Возможно ли использовать CallBack вызовы при написании своих классов (на С++, под OS Windows)? К примеру реализовать таймер при использовании Callback в своём классе!? SetTimer(NULL, 0, 1000, (TIMERPROC) TimerProc) void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)


Ответ

В общем виде передать указатель на нестатический, наверное, не получится. Но конкретно описываемую Вами задачу можно решить, например, так. Экземпляры классов, которые хотят получать уведомления от таймера регистрируются в некотором словаре, получая при этом идентификатор таймера. Обработчик таймера находит получателя по идентификатору таймера и переадресует вызов ему. Грубый пример: static int s_counter = 0; map s_receivers; class ITimerReciever { public: virtual void OnTimer() = 0; }
static void AdviseToTimer(UINT elapse, ITimerReceiver * pReceiver) { receivers[++s_counter] = pReceiver; SetTimer(NULL, s_counter, elapse, (TIMERPROC) TimerProc); }
void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) { receivers[idEvent]->OnTimer(); }

Комментариев нет:

Отправить комментарий