PDA

Просмотр полной версии : Таймеры и очередь таймеров в WinApi



Носферату
08.06.2004, 14:34
Нашел в Рихтере потом посмотрел в МСДН как оказалось не все так просто, ни от туда ни от туда примеры не работают
//--- Кому теперь верить :twisted: ---//

CreateTimerQueueTimer(
// указатель на хендл таймера
&hTimerQTimer,
// хендл очереди таймеров
NULL,
// функция обратного вызова
MsgBoxTimeout,
// параметр для функции обратного вызова
NULL,
// время задержки перед первым вызовом в милисекундах
100,
// период в милисекундах
100,
// флаги
0
);

: error C2065: 'CreateTimerQueueTimer' : undeclared identifier
Думаю не я один столкнулся с такой проблемой

Помогите, очень надо, заранее благодарен всем откликнувшимся

Hawk
08.06.2004, 14:56
Нужно свежее SDK, ктонить знает где его достать ? Для 6-ки ?

Romeo
08.06.2004, 15:43
Носферату, нужно было внимательнее читать 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, то всё красиво упадёт :-)

Hawk
08.06.2004, 16:04
Вот примерно так -



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.06.2004, 16:15
спасибо за помощь ...
Только меня вот что не радует, наколько это красиво, конечно вопрос риторический, но все-таки

Romeo
08.06.2004, 17:59
Это классический приём. О красоте в таких случаях распространяться не принято. Кстати, не забудь для LoadLibrary сделать потом FreeLibrary.

Hawk
09.06.2004, 07:25
Да насчет 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.06.2004, 10:47
Спасибо большое ...
А кстати сегодня случайно не день программиста ?

Hawk
11.06.2004, 11:14
Насчет дня, на одном форуме нашел хорошую фразу -


Хм... а зачем?
Программеры итак в основном каждый день бухают -)

Absurd
11.06.2004, 12:39
Нет, день программиста - 256-й день в году. Это должно быть ближе к осени.