| 
| 
 | Вопрос # 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] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |