Таймеры и очередь таймеров в WinApi

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
Носферату
Сообщения: 18
Зарегистрирован: 08 июн 2004, 13:37

08 июн 2004, 14:34

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

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

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

Помогите, очень надо, заранее благодарен всем откликнувшимся
Hawk
Сообщения: 215
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

08 июн 2004, 14:56

Нужно свежее SDK, ктонить знает где его достать ? Для 6-ки ?
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

08 июн 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, то всё красиво упадёт :-)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Hawk
Сообщения: 215
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

08 июн 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;
}
Носферату
Сообщения: 18
Зарегистрирован: 08 июн 2004, 13:37

08 июн 2004, 16:15

спасибо за помощь ...
Только меня вот что не радует, наколько это красиво, конечно вопрос риторический, но все-таки
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

08 июн 2004, 17:59

Это классический приём. О красоте в таких случаях распространяться не принято. Кстати, не забудь для LoadLibrary сделать потом FreeLibrary.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Hawk
Сообщения: 215
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

09 июн 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 не понадобится
А насчет красивости - очень даже красиво
Носферату
Сообщения: 18
Зарегистрирован: 08 июн 2004, 13:37

11 июн 2004, 10:47

Спасибо большое ...
А кстати сегодня случайно не день программиста ?
Hawk
Сообщения: 215
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

11 июн 2004, 11:14

Насчет дня, на одном форуме нашел хорошую фразу -
Хм... а зачем?
Программеры итак в основном каждый день бухают -)
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

11 июн 2004, 12:39

Нет, день программиста - 256-й день в году. Это должно быть ближе к осени.
2B OR NOT(2B) = FF
Ответить