Запуск кода в определенное время

Тема в разделе "WASM.WIN32", создана пользователем leeloo, 14 апр 2008.

  1. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    Программа работает постоянно. Нужно в полночь запустить кусок кода - как?
    Пробовал через таймер - не точно выполняет (опаздывает)
    Крутить таймер по 30 секунд влом.
    Есть какие варианты?
    Может есть что связанное со сменой дат ...
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    а зачем именно такая точность?
     
  3. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    Собирает данные и сохраняет в файл с текущей датой.
    Так вот - критичен момент перехода на новые сутки ...

    Наверно придется крутить таймер...
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Дров писать наверно придётся.
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Таймер-то какой использовал? Юзермодный (SetTimer) или ядерный (SetWaitableTimer, WaitForSingleObject)?
    Сделай отдельный поток с очень высоким приоритетом и используй ядерный таймер - должно сработать достаточно точно имхо.
     
  6. piritus

    piritus Member

    Публикаций:
    0
    Регистрация:
    7 июл 2007
    Сообщения:
    36
    Пример работы с драйвером времени и сам драйвер http://wasm.ru/docs/1/kmdtut.zip
     
  7. zStorm

    zStorm New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2005
    Сообщения:
    44
    Адрес:
    Ukraine
    а ты попробуй врубить не точный таймер, потом когда уже дело доходит до полуночи - включать точный
     
  8. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    Вроде сделал уже

    Код (Text):
    1. find_half_night proc    uses    edx ebx edi
    2. beg:   
    3.         invoke  GetLocalTime,   addr    systime
    4.             .if systime.wMinute!=59
    5.                 .if systime.wSecond!=59
    6.                     .if systime.wMilliseconds<500
    7.                         mov eax,    60;59
    8.                         sub ax, systime.wSecond
    9.                         mov ebx,    1000
    10.                         mul ebx
    11.                         mov ebx,    eax
    12.                         mov eax,    59
    13.                         sub ax, systime.wMinute
    14.                         mul ebx
    15.                         mov ebx,    eax
    16.                         .if systime.wHour!=23
    17.                             mov eax,    23
    18.                             sub ax, systime.wHour
    19.                             mul ebx
    20.                         .endif
    21.                         add eax,    60*1000
    22.                         invoke SetTimer,hWnd,6,eax,NULL        ; создадим таймер до полуночи
    23.                         mov timer_up_to_0000,eax
    24.                         ret
    25.                     .endif
    26.                 .endif
    27.             .endif
    28.         jmp beg
    29.     ret
    30.  
    31. find_half_night endp
    За секунду до полуночи выполняется нужный код.
     
  9. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    Х_х
    если бы ты не сказал "Крутить таймер по 30 секунд влом."
    то я бы тебе это первым же постом влепил.
     
  10. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    В порядке бреда: а если и правда использовать таймер ядра?

    .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;

    Эту загогулину естессно надо зашить в отдельный поток, чтоб не мешала работе основной проги.
     
  11. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    Коды в 8-м и 10-м постах скорее неверны (да простит меня DEEP) ...

    Я пораздумал над неправильностью кода .. (ох и эта 60-ричная система ...)

    За совет на ядро спасиб.

    Код (Text):
    1. find_half_night proc    uses    edx ebx edi esi
    2. LOCAL   systimes:SYSTEMTIME
    3. LOCAL   htimer:dword
    4.  
    5.     invoke  CreateEvent,0,1,0,SADD('Timer')
    6.     mov htimer, eax
    7.  
    8. beg:   
    9.         invoke  GetLocalTime,   addr    systimes
    10.             .if systimes.wMinute!=59   
    11.                 .if systimes.wSecond!=59
    12.                     .if systimes.wMilliseconds<500                     
    13.                         mov eax,    59                  ;   60 
    14.                         sub ax, systimes.wSecond        ;   res
    15.                         mov ebx,    1000               
    16.                         mul ebx                         ;   res*1000
    17.                         mov esi,    eax                 ;   milliseconds
    18.                        
    19.                         mov eax,    59
    20.                         sub ax, systimes.wMinute
    21.                         mov ebx,    60*1000            
    22.                         mul ebx                         ;  
    23.                         add eax,    esi                 ;   if  hour==23
    24.                         mov esi,    eax                 ;   milliseconds
    25.                         .if systimes.wHour!=23
    26.                             mov eax,    23
    27.                             sub ax, systimes.wHour
    28.                             mov ebx,    60*60*1000             
    29.                             mul ebx
    30.                             add eax,    esi                 ;   if  hour==23
    31.                             mov esi,    eax                 ;   milliseconds
    32.                         .endif
    33.                        
    34.                         invoke  WaitForSingleObject,    htimer,     eax
    35.                         invoke  CloseHandle,    htimer
    36.                         call    timer_0000
    37.                         ret
    38.                     .endif
    39.                 .endif
    40.             .endif
    41.         jmp beg
    42.     ret
    43.  
    44. find_half_night endp
     
  12. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    Удалено, дубль
     
  13. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    60-ричная система? О_о
     
  14. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Как буд-то ядерный таймер точнее юзермодного...
    Точнее, как буд-то в винде существует два типа объектов - юзермодный таймер и ядерный...
    Бред, короче.