SetTimer не выпоняет вызов процедуры

Тема в разделе "WASM.WIN32", создана пользователем ProgramMan, 8 окт 2004.

  1. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    По непонятной причине не работает код:
    Код (Text):
    1.  
    2. include '%fasminc%/win32ax.inc'
    3. .data
    4. TID dd 0
    5. .code
    6. start:
    7.  
    8. invoke SetTimer,NULL,NULL,1000,TimerProc
    9. mov [TID],eax
    10.  
    11. jmp $
    12. invoke  ExitProcess,0
    13.  
    14. proc TimerProc, hwnd, uMsg, idEvent, dwTime
    15.  int3
    16.  invoke  KillTimer,0,[TID]
    17.  invoke MessageBox, HWND_DESKTOP,'!','!', MB_OK
    18.  return
    19. endp
    20. .end start                
    21.  


    Управление TimerProc почему-то не передаётся...
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
  3. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    >invoke SetTimer,NULL,NULL,1000,TimerProc

    А OFFSET TimerProc где?
     
  4. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Если не заметно, то компилятор FASM
     
  5. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Не буду вникать, но однажды была похожая проблема, возможно поможет первый ручной вызов функции таймера.
     
  6. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
    bogrus прав. Если этот код без изменений вставить в программу, создающую окно, то все работает.

    А в этом варианте, мне кажется, если бы процедура и вызывалась, то через 1000 мс, а к тому времени процесс бы уже завершился.
     
  7. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Не завершится.

    ...

    jmp $

    invoke ExitProcess,0

    ...
     
  8. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    ProgramMan



    Так прога просто зависает в бесконечном цикле и не может получить отправленное сообщение WM_TIMER, как мне кажется.
     
  9. LocTb

    LocTb New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    54
    В продолжение bogrus.

    MSDN.COM:

    When you specify a TimerProc callback function, the default window procedure calls the callback function when it processes WM_TIMER. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER.
     
  10. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    хмм, почему-то не хочет работать сл кусок (на дисспатчмессэйдже виснет в дебуггере):


    Код (Text):
    1. start:
    2.         invoke SetTimer, 0,0,500d, timer_proc
    3.   msg_loop:
    4.         invoke  GetMessage,msg,NULL,WM_TIMER,WM_TIMER
    5.         or      eax,eax
    6.         jz      end_loop
    7.         invoke  TranslateMessage,msg
    8.         invoke  DispatchMessage,msg
    9.         jmp     msg_loop
    10.  
    11.   end_loop:
    12.         invoke  ExitProcess,0
    13. ;=====================================================================
    14. proc timer_proc
    15.  push    MB_OK               ; код процедуры
    16.  call    MessageBeep         ; код процедуры
    17.  return
    18. endp




    ps: юзается ФАСМ.
     
  11. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    call [MessageBeep]
     
  12. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    дык тогда можно просто написать так:
    Код (Text):
    1. start:
    2.         invoke SetTimer, 0,0,500d, timer_proc
    3.   msg_loop:
    4.         invoke  GetMessage,msg,NULL,WM_TIMER,WM_TIMER
    5.         ;А здесь вписать кода процедуры таймера
    6.         jmp     msg_loop
     
  13. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Можно и так, если таймер один и параметры (hwnd, uMsg, idEvent, dwTime) не нужны, вместо timer_proc ещё поставить NULL
     
  14. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    Тогда встает вопрос нужен ли вообще таймер? И проще написать так:
    Код (Text):
    1.  
    2. start:
    3. ;код программы
    4. invoke Sleep,500
    5. jmp start
    6.  


    Тут уже надо знать какая задача, а не просто делать таймер ради таймера
     
  15. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Ага, а потом загрузка проца 100%, мало ли ... может у кого места в притык и светится не хочет, там кстати я погорячился на счет параметров, что не нужны. Кому нужны, то можно брать из MSG (GetMessage,WM_TIMER их туда вписывает)
     
  16. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    Ну если кто-то еще пользуется Win9х, то для них можно написать WaitForSingleObject(0,500) :derisive:



    Сорри за офф