Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Пауза


Автор: I_Am_Rock 6.7.2010, 14:33
Добрый день.

Как сделать паузу? Sleep не подходит, так как грузит систему.
Читал, что можно с помощью SetTimer, но никак не могу найти пример чтобы не через wm_timer, а через callback - потому что wm_timer посылается окну, а у меня в приложении нет окна.

И еще - мне нужно именно на fasm  smile  Я другой синтаксис не пойму)

 smile 

Пожалуйста, напишите примерчик, чтоб после запуска программы выходил MessageBox, но не сразу, а через 5 секунд и чтобы это было реализовано SetTimer

Автор: spin2 6.7.2010, 14:59
Loop пустой, например.

Автор: I_Am_Rock 6.7.2010, 15:09
Извините, не понял?

Автор: I_Am_Rock 6.7.2010, 15:47
Если Вы имеете ввиду создание пустого цикла, который выполняется пока текущее время <= время начала цикла + 3000 мс, то я так пробовал - пауза получается, но система подвисает на это время 

Автор: JAPH 6.7.2010, 21:14
Sleep грузит систему? Хм... Вродь не должна

У SetTimer параметр HWND необязательный, и есть 4ый параметр lpTimerFunc ;)

Автор: I_Am_Rock 7.7.2010, 10:58
Цитата(JAPH @  6.7.2010,  21:14 Найти цитируемый пост)
Sleep грузит систему? Хм... Вродь не должна

100% загружает систему ((( Правда потом продолжает работу норм. Собственно, как и цикл, который повторяется пока не пройдет время. 


Цитата(JAPH @  6.7.2010,  21:14 Найти цитируемый пост)
У SetTimer параметр HWND необязательный, и есть 4ый параметр lpTimerFunc ;) 

Я знаю. Вот как я пытаюсь делать (FASM)

Код

proc MyTimeFunc hWnd,uMsg,idEvent,dwTime
   ;код, который работает по истечению времени
        dec [ccounter]
        jnz NoKill
        invoke KillTimer,NULL,[TimerID]
        invoke PostQuitMessage
NoKill:
        ret
endp 

;кусок в главной функции
;-------
invoke SetTimer,NULL,0,[hTime],MyTimeFunc
mov [TimerID],eax
repeatt:
invoke GetMessage,lpMsg,NULL,0,0
cmp eax,WM_QUIT
je exitt
invoke TranslateMessage,lpMsg
invoke DispatchMessage,lpMsg
jmp repeatt
exitt:
;-------

Автор: JAPH 17.7.2010, 14:24
Ну с таймером вроде все в порядке. А вот с GetMessage...
Цитата
If the function retrieves a message other than WM_QUIT, the return value is nonzero.

If the function retrieves the WM_QUIT message, the return value is zero. 

If there is an error, the return value is -1.


Код

    lea    ebx, [lpMsg]
    invoke    GetMessage, ebx, 0, 0, 0
    cmp    eax, 0
    jle    exitt

Автор: izl3sa 19.7.2010, 07:21
2I_Am_Rock
>> 100% загружает систему 
помоему вы не понимаете как работает система =\ 

Sleep -> NtDelayExecution -> KeDelayExecutionThread
Поток после перехода в ядро добавляется в очередь ожидания  и переходит в состояние ожидания. С этого момента поток не выполняется пока не выйдет интервал, если только он не alertable. Смотрите сурсы wrk\ntos\ke\wait.c
Sleep технически не может грузить систему. Проблема в ваших сорцах.

Автор: I_Am_Rock 21.7.2010, 12:05
JAPH, 
izl3sa, 

Спасибо, попробую

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)