Страница 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-й день в году. Это должно быть ближе к осени.