2014-11-18 3 views
0

привет, я пытаюсь использовать функцию таймера в программе c в окнах. мой код, как показано нижеФункция setwaitedtimer не вызывает функцию обратного вызова в c

#define _WIN32_WINNT 0x0400 
#define WT_EXECUTEINTIMERTHREAD 0x00000020 
#include<stdio.h 
#include<windows.h> 

typedef void (*callbackfunction)(); 

void timerfunction(callbackfunction cb); 

void callback() 
{ 
SYSTEMTIME time; 

int millis; 

int seconds; 
GetSystemTime(&time); 
millis =time.wMilliseconds; 
seconds=time.wSecond; 
printf("\n\ninside callback second=%d, milli=%d\n\n",seconds,millis); 
} 

void timerfunction(callbackfunction cb) 
{ 
HWND hwndTimer=NULL; 
HANDLE hnd; 
PHANDLE h_buffer=(PHANDLE)malloc(sizeof(PHANDLE)); 

int a; 
int qwDueTime; 

    UINT_PTR nIDEvent=1; 
    MSG msg;   // message structure 

    LARGE_INTEGER liDueTime; 
liDueTime.QuadPart=-100000000; 
a=10; 
    nIDEvent=nIDEvent+1; 
    hnd = CreateWaitableTimer(
    0, 
    FALSE, 
    0); 
    qwDueTime = -5*1000; 
    liDueTime.LowPart = (DWORD) (qwDueTime & 0xFFFFFFFF); 
    liDueTime.HighPart = (LONG) (qwDueTime >> 32); 

    SetWaitableTimer(hnd,&liDueTime,20,(PTIMERAPCROUTINE)cb,(LPVOID)a,TRUE); 
    // WaitForSingleObject(hnd,20); 

    // Wait for the timer. 

    } 




void main() 
{ 
callbackfunction cb= callback; 
int a; 
a=10; 
timerfunction(cb); 

Sleep(1000000); 

} 

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

Я использовал SetTimer() api, но время было больше, чем указано. Я делаю это для аудио, поэтому я хочу, чтобы точность времени составляла один миллисекунд. он переходит к функции таймера, но функция обратного вызова не запускается. путь я использую это правильно или я должен нужно использовать АНИ WaitForSingleObject

ответ

0

Вы производите свое имя функции до PTIMERAPCROUTINE. Возможно, это не так, потому что ваш код не работает, но он по-прежнему очень не прав.

Do NOT имена функций функций на все. If you need to cast a function, you're doing something wrong.

Сигнатура PTIMERAPCROUTINE является

VOID CALLBACK functionName(LPVOID lpArgToCompletionRoutine, DWORD dwTimerLowValue, DWORD dwTimerHighValue); 

Ваша функция MUST имеют эту подпись, особенноCALLBACK, как должен делать с calling convention.

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

+0

спасибо, что это была ошибка, которую я сделал. теперь его работа. – Dev

0

почему вы первый набор

liDueTime.QuadPart=-100000000; 

, который будет стрелять время 10 секунд после вызова SetWaitableTimer(), а затем

qwDueTime = -5*1000; 
liDueTime.LowPart = (DWORD) (qwDueTime & 0xFFFFFFFF); 
liDueTime.HighPart = (LONG) (qwDueTime >> 32); 

? Отрицательное время работы всего 5000 единиц 100 нс представляет собой относительную задержку только 500 микросекунд!

Посмотрите на MSDN Например:

#define _SECOND 10000000 
qwDueTime = -5 * _SECOND; 

Вы упускаете фактор 10000.

Вы должны оценить возвращаемое значение SetWaitableTimer для покрытия условий ошибки. Сводный код MSDN дает все подробности.

Однако более короткие задержки в диапазоне 1 мс могут быть достигнуты только с Multimedia Timers.

+0

спасибо за ответ. – Dev

+0

Благодарю вас за ответ. can u pls дают один пример в программе c для использования мультимедийных таймеров – Dev

+0

вы также можете использовать поисковые системы. Во всяком случае, [Использование таймерных очередей] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms687003%28v=vs.85%29.aspx) и [Использование мультимедийных таймеров] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd757664%28v=vs.85%29.aspx) могут быть запущенными. – Arno

Смежные вопросы