|
Вопрос # 4 938/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
У меня возникла проблема при опросе клавиатуры.
Мне нужно в цикле опрашивать клавиатуру и при нажатии на кнопки выполнять какие-то действия. Допустим при первом нажатии на кнопку 1 - выдавать сообщение, а при повторном нажатии стирать.
У меня все получается, если я быстро нажимаю и отпускаю кнопку, а если я держу кнопку нажатой, то надпись начинает моргать.
Как мне опрашивать клавиатуру, чтобы моя программа видела когда кнопка нажата, а когда отпущена? Была мысль вставить ассемблерный код, но я не знаю регистра клавиатуры и принципа скидывания туда информации.
Приложение: Переключить в обычный режим- Uses Crt;
- Var Key : Char;
- I:boolean;
- Begin
-
- Repeat
-
- If KeyPressed Then Begin Key:=ReadKey;
-
- Case Key Of
-
- #45: Begin
- If I=False Then begin
- gotoxy(40,12);Write('******');
- i:=true;
- End;
- If I=true Then begin
- gotoxy(40,12);Write(' ');
- i:=fasle;
- End;
-
- End;
-
-
- End;
- Until Key=#27;
 |
Вопрос задал: NSS (статус: Посетитель)
Вопрос отправлен: 21 января 2011, 11:02
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 23; последнее сообщение — 22 января 2011, 18:58; участников в обсуждении: 6.
Страницы: [1] [2] [Следующая »]
|
mirt.steelwater (статус: Посетитель), 21 января 2011, 11:12 [#1]:
есть события OnKeyDown & OnKeyUp формы - используйте их
Ⓐ свобода сопротивление солидарность
|
|
Вадим К (статус: Академик), 21 января 2011, 11:26 [#2]:
смотрим внимательно, тут формы нет! тут консоль
Галочка "подтверждения прочтения" - вселенское зло.
|
|
NSS (статус: Посетитель), 21 января 2011, 11:37 [#3]:
Я бы даже сказал Pascal 7 )
|
|
min@y™ (статус: Доктор наук), 21 января 2011, 11:54 [#4]:
Цитата (NSS):
Как мне опрашивать клавиатуру, чтобы моя программа видела когда кнопка нажата, а когда отпущена?
Чой-то мне кажется, что под TP7.0 это придётся делать через прерывания. Но за столько лет я, конечно, всё забыл.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
NSS (статус: Посетитель), 21 января 2011, 11:56 [#5]:
А может тогда под делфийскую консоль что нибудь подскажите?
Или дадите пинок в нужном направлении к Ассемблеру?
|
|
min@y™ (статус: Доктор наук), 21 января 2011, 12:15 [#6]:
Цитата (NSS):
А может тогда под делфийскую консоль что нибудь подскажите?
Программа должна быть обязательно консольной? Всё равно придётся регистрировать окно и петлю обработки сообщений.
Цитата (NSS):
Или дадите пинок в нужном направлении к Ассемблеру?
Нет, к сожалению, многое я подзабыл. Скинуть бы лет 10... Эх, молодость...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
NSS (статус: Посетитель), 21 января 2011, 13:45 [#7]:
Программа должна быть консольной. т.к. нужна высокая скорость обработки информации с LPT-порта (там оптический датчик).
Прогу я запускаю под Windows 98.
Апликашином конечно просто, но там таймер все дело портит, т.к. программа не успевает опрашивать изменения на датчике и пропускает его данные. Не помогает даже микросекундный таймер ((.
|
|
mirt.steelwater (статус: Посетитель), 21 января 2011, 13:56 [#8]:
я вижу, что консоль
ну и что
все равно проще создать окошко и в его главной функции обрабатывать эти события
function WindowProc (WND: HWND; Msg: Cardinal; WParam: WParam; LParam: LParam) : LResult; stdcall;
var
Message : TMessage;
begin
case Msg of
WM_DESTROY:
begin
Result := 0;
PostQuitMessage (0);
end;
WM_KEY_DOWN:
begin
Result := 0;
//...
end;
WM_KEY_UP:
begin
Result := 0;
//...
end;
else Result := DefWindowProc (WND,Msg,WParam,LParam);
end;
ProcessMessages;
end;
...
WC.cbSize := SizeOf (WC);
WC.style := CS_HREDRAW or CS_VREDRAW;
WC.lpfnWndProc := @WindowProc;
WC.cbClsExtra := 0;
WC.cbWndExtra := 0;
WC.hInstance := hModule (M.AllocationBase);
WC.hIcon := 0;
WC.hCursor := 0;
WC.hbrBackground := COLOR_BTNFACE+1;
WC.lpszMenuName := NIL;
WC.lpszClassName := 'program name';
RegisterClassEx (WC);
WHandle := CreateWindowEx(0,
WC.lpszClassName,
PChar ( Format ('%s',[ WC.lpszClassName ]) ),
WS_OVERLAPPEDWINDOW,
0,
0,
0,
0,
0,
0,
WC.hInstance,
nil);
Ⓐ свобода сопротивление солидарность
|
|
Вадим К (статус: Академик), 21 января 2011, 14:07 [#9]:
микросекундный драйвер под виндой? нет, нельзя с пользовательского приложения. виндовс не риалтайм система. Максимум, что можно выжать - это 50-100 мс. Да, не больше 0.05 секунды.
либо нужно брать dos (можно например взять freedos, который можно сделать 32битным, то есть, если все правильно сделать, то и на делфи консольное приложение запустить) или qnx.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
NSS (статус: Посетитель), 21 января 2011, 14:14 [#10]:
а в FreeDos сетку трудно поднять?
А то я в Win98 решаю сразу два вопроса: есть сетка и консоль работает быстро. ))
|
|
Толяныч (статус: 4-ый класс), 21 января 2011, 14:20 [#11]:
Что-то непонятное - нехватает микросекундного быстродействия - и это при клавиатурном вводе? У меня не укладывается в голове человек, молотящий клаву с частотой 1 MHz.
Закинул хелпик, там по древним ОС много интересного :
http://zalil.ru/30376680
http://zalil.ru/30376687
Клавиатурного шпиона мастерим ?
|
|
Вадим К (статус: Академик), 21 января 2011, 14:32 [#12]:
Подымают люди. все возможно. Если сетевая ни какая то экзотическая, то очень большой шанс, что все будет поднято.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
NSS (статус: Посетитель), 21 января 2011, 15:22 [#13]:
>Что-то непонятное - нехватает микросекундного быстродействия -
>и это при клавиатурном вводе? У меня не укладывается в голове
>человек, молотящий клаву с частотой 1 MHz.
В цикле с максимальной скоростью идет опрос датчика.
А клаву надо проверять в промежутках между или просто в подпрограмме меню.
|
|
mirt.steelwater (статус: Посетитель), 21 января 2011, 15:28 [#14]:
возможно лучше опрашивать клавиатуру и снимать показания с датчика в двух параллельных потоках? На датчик выделить поток TIME_CRITICAL, а на клавиатуру LOWEST
дело в том, что если использовать сообщения windows, которые ставятся в очередь, а не прерывания, то вы ничего не пропустите даже с малым приоритетом потока опроса клавиатуры. конечно, между нажатием кнопки и событием на нее повешенным пройдет чуть больше времени - 10-15 мс, но при условии, что сообщения не теряются - не вижу зачем же так мгновенно реагировать на нажатия клавиш, ведь время срабатывания клавиши физически также порядка этой величины..
Ⓐ свобода сопротивление солидарность
|
|
NSS (статус: Посетитель), 21 января 2011, 15:52 [#15]:
Как раз опрос кнопок не требует огромного быстродействия, 100-300мс вполне достаточно, а вот опрос датчика должен происходить строго каждые 0.07мс иначе начинает пропадать информация.
Вот тут и начинается засада, Делфи постоянно тормозит, да и Windows непонятно что может творить и приостанавливать программу.
Одна надежда на Консоль, но и тут засада)))))
|
|
Вадим К (статус: Академик), 21 января 2011, 16:02 [#16]:
консоль работает под виндой и подчиняется всем правилам винды, как бы вы не хотели другого.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
КМ (статус: Посетитель), 21 января 2011, 16:34 [#17]:
Если нужна спупер точная и быстродествующая система
без системы на железе не обойтись...
Добро пожаловать в мир микроконтроллеров...
ПЛИСов, DSP ))
|
|
mirt.steelwater (статус: Посетитель), 21 января 2011, 17:37 [#18]:
поэтому я и предлагаю разделить задачи по потокам с разнымит приоритетами
для того, чтобы данные не терялись ваше устройство должно иметь буфер отправки данных и не просто слать их "куда подальше.. в порт", а отсылать по мере чтения и только после этого опустошать буфер, причем по-элементно и с конца
Ⓐ свобода сопротивление солидарность
|
|
Толяныч (статус: 4-ый класс), 21 января 2011, 23:23 [#19]:
КМ: Если нужна спупер точная и быстродествующая система
без системы на железе не обойтись...
Добро пожаловать в мир микроконтроллеров...
ПЛИСов, DSP ))
Присоединяюсь однозначно
|
|
NSS (статус: Посетитель), 22 января 2011, 15:58 [#20]:
Да к ним то родным я уже давно пожаловал )))))))
Задачка для них сложноватая, вот я и хочу от них отмазаться ПКшкой. Думал проканает без них обойтись.
Обидно, что все уже работает, проблема только с копками.
Цитата:
> консоль работает под виндой и подчиняется всем правилам винды,
> как бы вы не хотели другого.
В винде от 2000 и выше программа притормаживает и теряет данные с датчика, а в винде 98 такого нет - прога работает без лагов.
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|