Проблема собственно следующая: Создаю таймер и пытаюсь его настроить. Функция SetWaitableTimer заканчивается с нулём в EAX, код ошибки: ERROR_NOACCESS (000003E6) Вот кусок кода: Код (Text): ... pParam dd 10h ;параметр передаваемый в процедуру pTime dd -10000000,-1 ;время до старта (10000000 х 0.1мс -> 1с) hTimer dd ? ;хендл таймера ... ... lbtn1: invoke CreateWaitableTimer,0,0,0 ;Создаём таймер mov [hTimer],EAX ;Сохраняем его нендл invoke SetWaitableTimer,\ ;настраиваем... EAX,\ ;его хендл pTime,\ ;указатель на время пуска (qword) 1000,\ ;интервал действия (longword -> dword) TimerProc,\ ;адрес вызываемой таймером процедуры pParam,\ ;адрес параметра передоваемого в процедуру 0 ;выход из suspend mode (1-да\0-нет) test EAX,EAX jz lbtn2 ;если таймер не настроился, закрываем хендл jmp xfinish ;выходим lbtn2: invoke CloseHandle,[hTimer] ;закрываем хендл таймера jmp xfinish ... ... xfinish:xor EAX,EAX finish: pop edi esi ebx ret ... ... proc TimerProc param,tmrlo,tmrhi ;процедура таймера push ebx esi edi invoke MessageBox,[hMain],tTitle,tTitle,0 pop edi esi ebx ret endp Описание параметров функции SetWaitableTimer из MSND: Код (Text): BOOL SetWaitableTimer( HANDLE hTimer, // handle to a timer object const LARGE_INTEGER *pDueTime, // when timer will become signaled LONG lPeriod, // periodic timer interval PTIMERAPCROUTINE pfnCompletionRoutine, // pointer to the completion routine LPVOID lpArgToCompletionRoutine, // data passed to the completion routine BOOL fResume // flag for resume state ); Памагите разобратся... _860427706__timer.rar
Puncher Умеешь задавать вопросы и хорошо что исходник выложил проблема в выравнивании на 4 структуры pTime, данные лучше размещать в таком порядке: - структуры\массивы (размером кратно 4) - переменные dd - строковые db У тебя же все наоборот, если так нравится то после db ставь align 4
Ага точно. Выровнять надо было Вот. Таймер создался, только теперь надо его заставить процедуру вызывать. У меня что-то нехочет
SetTimer не выпоняет вызов процедуры это если тебе нужен обычный таймер, для асинхронных надо юзать не DispatchMessage, а SleepEx, SignalObjectAndWait, WaitForSingleObjectEx, WaitForMultipleObjectsEx, MsgWaitForMultipleObjectsEx Код (Text): ;===================================================================== handle dd 0 ftime FILETIME -10000000,-1 ;===================================================================== entry $ stdcall [CreateWaitableTimer],0,0,0 mov [handle],eax stdcall [SetWaitableTimer],eax,ftime,0,timer_proc,0,0 stdcall [SleepEx],-1,1 stdcall [CloseHandle],[handle] stdcall [ExitProcess],0 ;===================================================================== proc timer_proc,param,tmrlo,tmrhi stdcall [MessageBeep],MB_OK ret endp ;=====================================================================
В общем на данном этапе сделал так: Код (Text): ... invoke SetTimer,0,ID_TIMER,1000,TimerProc mov [hTimer],EAX ... ... proc TimerProc hwnd,umsg,tmrid,time push ebx esi edi ... pop edi esi ebx ret endp Используя эту весч можно избежать проверки сообщения WM_TIMER. Вот только с SeetWaitableTimer пака не всё ястно, буду разбираться. _1097733319__timer_01.rar
Puncher С SetWaitableTimer работать просто, когда знаешь как Код (Text): LOCAL hTimer:DWORD LOCAL dTime:ULARGE_INTEGER or dTime.HighPart,-1 ; периодичность срабатывания mov dTime.LowPart,-100000000 ; заводим на 10 секунд invoke SetWaitableTimer,hTimer,addr dTime,0,NULL,0,FALSE И все. В данном примере таймер сработает один раз через 10 секунд. После этого можешь его завести еще раз, либо отпустить вот так: Код (Text): invoke CancelWaitableTimer,hTimer