По непонятной причине не работает код: Код (Text): include '%fasminc%/win32ax.inc' .data TID dd 0 .code start: invoke SetTimer,NULL,NULL,1000,TimerProc mov [TID],eax jmp $ invoke ExitProcess,0 proc TimerProc, hwnd, uMsg, idEvent, dwTime int3 invoke KillTimer,0,[TID] invoke MessageBox, HWND_DESKTOP,'!','!', MB_OK return endp .end start Управление TimerProc почему-то не передаётся...
Конечно , а где MSG , где GetMessage(WM_TIMER)-DispatchMessage ? см. пример http://wasm.ru/forum/index.php?action=vthread&forum=4&topic=5265&page=1#7 з.ы. если будут проблемы с MessageBox , читать тут http://wasm.ru/forum/index.php?action=vthread&forum=4&topic=7041
Не буду вникать, но однажды была похожая проблема, возможно поможет первый ручной вызов функции таймера.
bogrus прав. Если этот код без изменений вставить в программу, создающую окно, то все работает. А в этом варианте, мне кажется, если бы процедура и вызывалась, то через 1000 мс, а к тому времени процесс бы уже завершился.
ProgramMan Так прога просто зависает в бесконечном цикле и не может получить отправленное сообщение WM_TIMER, как мне кажется.
В продолжение 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.
хмм, почему-то не хочет работать сл кусок (на дисспатчмессэйдже виснет в дебуггере): Код (Text): start: invoke SetTimer, 0,0,500d, timer_proc msg_loop: invoke GetMessage,msg,NULL,WM_TIMER,WM_TIMER or eax,eax jz end_loop invoke TranslateMessage,msg invoke DispatchMessage,msg jmp msg_loop end_loop: invoke ExitProcess,0 ;===================================================================== proc timer_proc push MB_OK ; код процедуры call MessageBeep ; код процедуры return endp ps: юзается ФАСМ.
дык тогда можно просто написать так: Код (Text): start: invoke SetTimer, 0,0,500d, timer_proc msg_loop: invoke GetMessage,msg,NULL,WM_TIMER,WM_TIMER ;А здесь вписать кода процедуры таймера jmp msg_loop
Можно и так, если таймер один и параметры (hwnd, uMsg, idEvent, dwTime) не нужны, вместо timer_proc ещё поставить NULL
Тогда встает вопрос нужен ли вообще таймер? И проще написать так: Код (Text): start: ;код программы invoke Sleep,500 jmp start Тут уже надо знать какая задача, а не просто делать таймер ради таймера
Ага, а потом загрузка проца 100%, мало ли ... может у кого места в притык и светится не хочет, там кстати я погорячился на счет параметров, что не нужны. Кому нужны, то можно брать из MSG (GetMessage,WM_TIMER их туда вписывает)
Ну если кто-то еще пользуется Win9х, то для них можно написать WaitForSingleObject(0,500) Сорри за офф