2013-08-19 3 views
1

Мне нужен таймер для запуска функции каждые 1 секунду.WinApi SetTimer не может скомпилировать

Я попытался SetTimer, мой код:

const UINT_PTR TIMER_ID = 1000; 

DWORD DownloadThread() 
{ 
    SetTimer(NULL, TIMER_ID, 1000, (TIMERPROC)DownloadSpeedCounter); 
    /*some stuff*/ 
} 

void DownloadSpeedCounter() 
{ 
    /*some stuff*/ 
} 

Я не могу скомпилировать этот код и получить error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'TIMERPROC'

Также метод член класса.

+1

Компилятор сообщает вам, в чем проблема. 'SetTimer()' ожидает функцию с определенной сигнатурой, а ваша не соответствует. –

+2

Использование SetTimer() в потоке, который не передает цикл сообщений, также не работает. –

ответ

2

Это потому, что вы пытаетесь использовать обычную функцию как функцию обратного вызова, определяемую приложением. То, что вы, вероятно, ищете это приложение определенную функции обратного вызова, которая может выглядеть следующим образом:

VOID CALLBACK DownloadSpeedCounter( 
HWND hwnd,  // handle to window for timer messages 
UINT message,  // WM_TIMER message 
UINT idTimer,  // timer identifier 
DWORD dwTime) { 
    /* some stuff */ 
} 

Для получения дополнительной информации об использовании функции обратного вызова для таймера см this article.

+0

Проблема осталась в любом случае. – ST3

+0

Этот пример работает для вас, тот, который указан в ссылке? –

+1

Я прочитал эту статью раньше, прочитал [этот ответ] (http://stackoverflow.com/a/18312253/1237747), он объясняет все, а также ваш ответ тоже полезен. – ST3

1

Одна из проблем состоит в том, что TIMERPROC функции должен выглядеть следующим образом: typedef VOID (CALLBACK* TIMERPROC)(HWND, UINT, UINT_PTR, DWORD); Так ваше определение метод должен выглядеть следующим образом:

VOID CALLBACK DownloadSpeedCounter(HWND, UINT, UINT_PTR, DWORD); 

Кроме того, так как это метод, а не просто функция, она должна быть static. Таким образом, он звонит как static, но для доступа к частным нестатическим данным может быть использован this technique.