Страница 1 из 1
Таймеры и очередь таймеров в WinApi
Добавлено: 08 июн 2004, 14:34
Носферату
Нашел в Рихтере потом посмотрел в МСДН как оказалось не все так просто, ни от туда ни от туда примеры не работают
//--- Кому теперь верить :twisted: ---//
CreateTimerQueueTimer(
// указатель на хендл таймера
&hTimerQTimer,
// хендл очереди таймеров
NULL,
// функция обратного вызова
MsgBoxTimeout,
// параметр для функции обратного вызова
NULL,
// время задержки перед первым вызовом в милисекундах
100,
// период в милисекундах
100,
// флаги
0
);
: error C2065: 'CreateTimerQueueTimer' : undeclared identifier
Думаю не я один столкнулся с такой проблемой
Помогите, очень надо, заранее благодарен всем откликнувшимся
Добавлено: 08 июн 2004, 14:56
Hawk
Нужно свежее SDK, ктонить знает где его достать ? Для 6-ки ?
Добавлено: 08 июн 2004, 15:43
Romeo
Носферату, нужно было внимательнее читать MSDN:
Client: Included in Windows XP and Windows 2000 Professional.
Server: Included in Windows Server 2003 and Windows 2000 Server.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.
Platform SDK Release: February 2003
Короче, если у тебя нету SDK от февраля прошлого года, то единственный выход - динамическая загрузка kernel32.dll с помощью LoadLibrary и получение адреса процедуры с помощью GetProcAddress.
P.S. Обязательно проверяй результат работы последней функции. Если система не Window 2000 или XP, то всё красиво упадёт :-)
Добавлено: 08 июн 2004, 16:04
Hawk
Вот примерно так -
Код: Выделить всё
typedef BOOL (WINAPI *CreateTimerQueueTimerT)( PHANDLE phNewTimer , HANDLE TimerQueue , WAITORTIMERCALLBACKFUNC Callback , PVOID Parameter , DWORD DueTime , DWORD Period , ULONG Flags );
typedef HANDLE (*CreateTimerQueueT)(VOID);
VOID CALLBACK WaitOrTimerCallback(
PVOID lpParameter, // thread data
BOOLEAN TimerOrWaitFired // reason
)
{
return;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
HACCEL hAccelTable;
// Create a multishot 1 second timer that begins firing after 1 second.
HANDLE hTimerQ;
HANDLE hTimerQTimer;
HMODULE hMod = LoadLibrary("kernel32.dll");
CreateTimerQueueTimerT CreateTimerQueueTimer = (CreateTimerQueueTimerT)::GetProcAddress(hMod, "CreateTimerQueueTimer");
CreateTimerQueueT CreateTimerQueue = (CreateTimerQueueT)::GetProcAddress(hMod, "CreateTimerQueue");
FreeLibrary(hMod);
if (!CreateTimerQueueTimer || !CreateTimerQueue)
{
return 0;
}
hTimerQ = CreateTimerQueue();
BOOL bRes = CreateTimerQueueTimer(
// CreateTimerQueueTimer(
&hTimerQTimer,
hTimerQ,
WaitOrTimerCallback/*MsgBoxTimeout*/,
NULL,
100,
100,
WT_EXECUTEINIOTHREAD
);
return 0;
}
Добавлено: 08 июн 2004, 16:15
Носферату
спасибо за помощь ...
Только меня вот что не радует, наколько это красиво, конечно вопрос риторический, но все-таки
Добавлено: 08 июн 2004, 17:59
Romeo
Это классический приём. О красоте в таких случаях распространяться не принято. Кстати, не забудь для LoadLibrary сделать потом FreeLibrary.
Добавлено: 09 июн 2004, 07:25
Hawk
Да насчет FreeLiobrary a не совсем корректно написал, но работать будет нормльно т.к. kernel32.dll всегда подгружается к процесу. так, что лучше наверно заменить на такой вызов -
Код: Выделить всё
HMODULE hMod = GetModuleHandle("kernel32.dll");
CreateTimerQueueTimerT CreateTimerQueueTimer = (CreateTimerQueueTimerT)::GetProcAddress(hMod, "CreateTimerQueueTimer");
CreateTimerQueueT CreateTimerQueue = (CreateTimerQueueT)::GetProcAddress(hMod, "CreateTimerQueue");
if (!CreateTimerQueueTimer || !CreateTimerQueue)
{
return 0;
}
Тогда и FreeLibrary не понадобится
А насчет красивости - очень даже красиво
Добавлено: 11 июн 2004, 10:47
Носферату
Спасибо большое ...
А кстати сегодня случайно не день программиста ?
Добавлено: 11 июн 2004, 11:14
Hawk
Насчет дня, на одном форуме нашел хорошую фразу -
Хм... а зачем?
Программеры итак в основном каждый день бухают -)
Добавлено: 11 июн 2004, 12:39
Absurd
Нет, день программиста - 256-й день в году. Это должно быть ближе к осени.