Программа работает постоянно. Нужно в полночь запустить кусок кода - как? Пробовал через таймер - не точно выполняет (опаздывает) Крутить таймер по 30 секунд влом. Есть какие варианты? Может есть что связанное со сменой дат ...
Собирает данные и сохраняет в файл с текущей датой. Так вот - критичен момент перехода на новые сутки ... Наверно придется крутить таймер...
Таймер-то какой использовал? Юзермодный (SetTimer) или ядерный (SetWaitableTimer, WaitForSingleObject)? Сделай отдельный поток с очень высоким приоритетом и используй ядерный таймер - должно сработать достаточно точно имхо.
Вроде сделал уже Код (Text): find_half_night proc uses edx ebx edi beg: invoke GetLocalTime, addr systime .if systime.wMinute!=59 .if systime.wSecond!=59 .if systime.wMilliseconds<500 mov eax, 60;59 sub ax, systime.wSecond mov ebx, 1000 mul ebx mov ebx, eax mov eax, 59 sub ax, systime.wMinute mul ebx mov ebx, eax .if systime.wHour!=23 mov eax, 23 sub ax, systime.wHour mul ebx .endif add eax, 60*1000 invoke SetTimer,hWnd,6,eax,NULL ; создадим таймер до полуночи mov timer_up_to_0000,eax ret .endif .endif .endif jmp beg ret find_half_night endp За секунду до полуночи выполняется нужный код.
Х_х если бы ты не сказал "Крутить таймер по 30 секунд влом." то я бы тебе это первым же постом влепил.
В порядке бреда: а если и правда использовать таймер ядра? .data TS SYSTEMTIME <>; EC db "MEGA_TIMER",0; .code PUSH OFFSET EC; PUSH 0; PUSH 1; PUSH 0; CALL CreateEvent; MOV EBX, EAX; PUSH OFFSET TS; CALL GetLocalTime; MOV ESI, 24; SUB SI, TS.wHour; IMUL ESI, 0E10h; MOV EDI, 60; IMUL DI, TS.wMinute; SUB ESI, EDI; SUB SI, TS.wSecond; IMUL ESI, 03E8h; PUSH ESI; PUSH EBX; CALL WaitForSingleObject; PUSH EBX; CALL CloseHandle; ; ...А тут код, к-рый надо выполнить в полночь RET; Эту загогулину естессно надо зашить в отдельный поток, чтоб не мешала работе основной проги.
Коды в 8-м и 10-м постах скорее неверны (да простит меня DEEP) ... Я пораздумал над неправильностью кода .. (ох и эта 60-ричная система ...) За совет на ядро спасиб. Код (Text): find_half_night proc uses edx ebx edi esi LOCAL systimes:SYSTEMTIME LOCAL htimer:dword invoke CreateEvent,0,1,0,SADD('Timer') mov htimer, eax beg: invoke GetLocalTime, addr systimes .if systimes.wMinute!=59 .if systimes.wSecond!=59 .if systimes.wMilliseconds<500 mov eax, 59 ; 60 sub ax, systimes.wSecond ; res mov ebx, 1000 mul ebx ; res*1000 mov esi, eax ; milliseconds mov eax, 59 sub ax, systimes.wMinute mov ebx, 60*1000 mul ebx ; add eax, esi ; if hour==23 mov esi, eax ; milliseconds .if systimes.wHour!=23 mov eax, 23 sub ax, systimes.wHour mov ebx, 60*60*1000 mul ebx add eax, esi ; if hour==23 mov esi, eax ; milliseconds .endif invoke WaitForSingleObject, htimer, eax invoke CloseHandle, htimer call timer_0000 ret .endif .endif .endif jmp beg ret find_half_night endp
Как буд-то ядерный таймер точнее юзермодного... Точнее, как буд-то в винде существует два типа объектов - юзермодный таймер и ядерный... Бред, короче.