|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
06.01.2011, 20:48 | #1 |
Регистрация: 05.12.2010
Сообщений: 5
|
tasm32 не выполняет событие после сравнения строк функцией апи
консольное приложение, не выполняет событие пищалки, оно должно сработать когда реальное время совпадет с введенным, время плохо обнавляется из-за моей проблемы с проверкой на входное устройство он его ждет пока не нажмется клавиша или не двинется мышь только потом обновляет время, ввод времени для пищалки через таб.
1.В чем проблема при сравнении строк, почему в еах (строка 66) не заностися ноль, может строки не совпадают из-за того что в одной нет нуля в конце? 2.Как можно улучшить код, чтобы время обновлялось не дожидаясь нажатия клавиши или движения мыши? p.s. если убрать проверку на клавиатуру с 39-41 строку, то время обновляется нормально. includelib import32.lib extrn ExitProcess:near extrn WriteConsoleA:near extrn ReadConsoleA:near extrn ReadConsoleInputA:near extrn GetStdHandle:near extrn Beep:near extrn Sleep:near extrn SetConsoleTextAttribute:near extrn SetConsoleCursorPosition:near extrn MessageBoxA:near extrn GetTimeFormatA:near extrn lstrcmp:near .386 .model flat,stdcall .data Coord struc x word (?) y word (?) Coord ends Crd Coord ? timebuff db '00:00:00',0 timerbuff db '00:00:00',0 message db 'Welcome!',0 ns dd ? buffer dd 256 dup (?) tit db '----',0 mes db 'mess',0 m dd ? hin dd ? hout dd ? .code start: call GetStdHandle,-10 mov hin,eax call GetStdHandle,-11 mov hout,eax read_: call ReadConsoleInputA,hin,offset buffer,1,offset ns,0 cmp word ptr buffer,1h jne time_ escape_: cmp byte ptr buffer+14,27 jne endescape_ cmp byte ptr buffer+4,0 jz endescape_ jmp esc_ endescape_: writemessage_: cmp byte ptr buffer+14,8 jne endwritemessage_ cmp byte ptr buffer+4,0 jz endwritemessage_ call MessageBoxA,0,offset mes,offset tit,0 endwritemessage_: enter_: cmp byte ptr buffer+14,9 jne endenter_ cmp byte ptr buffer+4,0 jz endenter_ mov Crd.y,1 mov Crd.x,0 call SetConsoleCursorPosition,hout,Crd call ReadConsoleA,hin,offset timerbuff,8,offset ns,0 endenter_: call lstrcmp,offset timebuff,offset timerbuff cmp eax,0 jne read_ call Beep,1000,800 jmp read_ time_: call GetTimeFormatA,0,8h,0,0,offset timebuff,9 mov Crd.y,0 mov Crd.x,0 call SetConsoleCursorPosition,hout,Crd call WriteConsoleA,hout,offset timebuff,8,offset ns,0 call Sleep,501 jmp read_ esc_: call Beep,1000,100 call ExitProcess,0 end start |
06.01.2011, 20:49 | #2 |
Регистрация: 05.12.2010
Сообщений: 5
|
includelib import32.lib
extrn ExitProcess:near extrn WriteConsoleA:near extrn ReadConsoleA:near extrn ReadConsoleInputA:near extrn GetStdHandle:near extrn Beep:near extrn Sleep:near extrn SetConsoleTextAttribute:near extrn SetConsoleCursorPosition:near extrn MessageBoxA:near extrn GetTimeFormatA:near extrn lstrcmp:near .386 .model flat,stdcall .data Coord struc x word (?) y word (?) Coord ends Crd Coord ? timebuff db '00:00:00',0 timerbuff db '00:00:00',0 ns dd ? buffer dd 256 dup (?) hin dd ? hout dd ? .code start: call GetStdHandle,-10 mov hin,eax call GetStdHandle,-11 mov hout,eax read_: call ReadConsoleInputA,hin,offset buffer,1,offset ns,0 cmp word ptr buffer,1h jne read_ escape_: cmp byte ptr buffer+14,27 jne endescape_ cmp byte ptr buffer+4,0 jz endescape_ jmp esc_ endescape_: enter_: cmp byte ptr buffer+14,9 jne endenter_ cmp byte ptr buffer+4,0 jz endenter_ mov Crd.y,1 mov Crd.x,0 call SetConsoleCursorPosition,hout,Crd call ReadConsoleA,hin,offset timerbuff,8,offset ns,0 endenter_: call lstrcmp,offset timebuff,offset timerbuff cmp eax,0 je b1 jb b_1 jnbe b1_ b1: call Beep,1000,800 jmp read_ b_1: call Beep,100,100 jmp read_ b1_: call Beep,1000,100 jmp read_ esc_: call Beep,1000,100 call ExitProcess,0 end start проверял просто сверяя строки символов timebuff timeRbuff удивительно,но событие равенства выполняется, появляяется вопрос что лишеного поподает в timebuff когда получаю время функцией GetTimeFormatA,0,8h,0,0,offset timebuff,9 из-за чего и происходит вся кракозябра? |
06.01.2011, 22:28 | #3 |
Регистрация: 05.12.2010
Сообщений: 5
|
Остался последний вопрос: как можно сделать чтобы при опросе буфера клавиатуры, если не было нажато ни каких клавиш и ни чего не было сдвинуто (мышь,...), то пропускать ReadConsoleInputA, чтобы время обновлялось?
Код заработавшей программы: includelib import32.lib extrn ExitProcess:near extrn WriteConsoleA:near extrn ReadConsoleA:near extrn ReadConsoleInputA:near extrn GetStdHandle:near extrn Beep:near extrn Sleep:near extrn SetConsoleTextAttribute:near extrn SetConsoleCursorPosition:near extrn MessageBoxA:near extrn GetTimeFormatA:near extrn lstrcmp:near .386 .model flat,stdcall .data Coord struc x word (?) y word (?) Coord ends Crd Coord ? timebuff db '00:00:00_-',0 timerbuff db '00:00:00',0 message db 'Welcome!',0 ns dd ? buffer dd 256 dup (?) tit db '----',0 mes db 'mess',0 m dd ? hin dd ? hout dd ? .code start: call GetStdHandle,-10 mov hin,eax call GetStdHandle,-11 mov hout,eax read_: call ReadConsoleInputA,hin,offset buffer,1,offset ns,0 ;cmp word ptr buffer,1h ;jne time_ escape_: cmp byte ptr buffer+14,27 jne endescape_ cmp byte ptr buffer+4,0 jz endescape_ jmp esc_ endescape_: writemessage_: cmp byte ptr buffer+14,8 jne endwritemessage_ cmp byte ptr buffer+4,0 jz endwritemessage_ call MessageBoxA,0,offset mes,offset tit,0 endwritemessage_: enter_: cmp byte ptr buffer+14,9 jne endenter_ cmp byte ptr buffer+4,0 jz endenter_ mov Crd.y,1 mov Crd.x,0 call SetConsoleCursorPosition,hout,Crd call ReadConsoleA,hin,offset timerbuff,8,offset ns,0 endenter_: ;jmp read_ time_: call GetTimeFormatA,0,8h,0,0,offset timebuff,9 mov Crd.y,0 mov Crd.x,0 call SetConsoleCursorPosition,hout,Crd call WriteConsoleA,hout,offset timebuff,8,offset ns,0 call Sleep,501 call lstrcmp,offset timebuff,offset timerbuff cmp eax,0 jne read_ ; jb b_1 ; jnbe b1_ b1: call Beep,1000,800 jmp read_ ;b_1: ; call Beep,100,100 ; jmp read_ ;b1_: ; call Beep,1000,50 ; jmp read_ esc_: call Beep,1000,100 call ExitProcess,0 end start |
07.01.2011, 02:12 | #4 |
Непрофессионал
Участник клуба
Регистрация: 01.01.2008
Сообщений: 1,405
|
Можно вывод времени вынести в Thread. Можно в мультимедийный таймер, он тоже в своём потоке работает. Только cинхронизацию с основным процессом надо продумать.
Например как то так: Код:
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------ Страничка с моими программками http://ulex-masm.ru |
07.01.2011, 14:56 | #5 |
Регистрация: 05.12.2010
Сообщений: 5
|
спасибо подумаю,а как можно пропускать команду ReadConsoleInput если ничего не нажималось?
|
08.01.2011, 18:59 | #6 |
Регистрация: 05.12.2010
Сообщений: 5
|
появился другой вопрос, как проверить было ли изменение в буфере клавиатуры?
|
08.01.2011, 20:45 | #7 | |
Непрофессионал
Участник клуба
Регистрация: 01.01.2008
Сообщений: 1,405
|
Есть такая функция, которая позволяет узнать количество событий во входном буфере консоли.
Цитата:
Код:
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------ Страничка с моими программками http://ulex-masm.ru |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблема сравнения строк | securus | Общие вопросы C/C++ | 7 | 21.12.2010 03:12 |
функция,которая выполняет сложение двух чисел,заданных в виде строк | 6kakain9 | Помощь студентам | 3 | 10.02.2010 17:55 |
программа для сравнения строк ТМемо | MixanMM | Компоненты Delphi | 2 | 02.07.2009 13:28 |
перезапись значений в файле.txt после сравнения | SarahConner | Общие вопросы Delphi | 0 | 21.03.2009 00:19 |
сравнение текущего года и месяца с годом и месяцем поступления, а после сравнения записать номер курса | Таня84 | БД в Delphi | 5 | 11.06.2007 13:53 |