Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите победить тетю клаву [D7, Win95/98, WinXP]


RapTor ©   (2004-07-07 18:06:00) 

Господа! Как можно из цикла, в коротом нельзя делать Application.ProcessMessages опросить быстро клавиатуру на предмет нажатия "Esc".
По портам 60 и 64 сразу говорю не канает. - не на всех системах пашет.
Может кто-то предложить что-то толковое, корректно и быстро работаеюще под всеми системами?


RapTor   (2004-08-02 17:41:00) [1]

Найди инфу на RTSC и сам сможешь сделать.


KADAN   (2004-07-09 10:28:00) [2]

микросекуды??? постойте-ка...
(1/1000*сек)/(1/1000000*сек)=.... ОГО! дык это ж в тысячу раз меньше миллисекунды... я тоже хочу такую точность по времени... мож меня научишь?


Digitman   (2004-07-09 09:06:00) [3]


> oomneeq


при риэл-тайм приоритете отца русской демократии уже ничто не спасет


oomneeq   (2004-07-08 20:40:00) [4]

GetAsyncKeyState не спасет ли отца русской демократии?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/KeyboardInput/KeyboardInputReference/KeyboardInputFunctions/GetAsyncKeyState.asp


Digitman   (2004-07-08 12:26:00) [5]


> таймер в микросекундах


любопытно, зачем тебе понадобилось такое временное разрешение - микросекунды


> Без реалтайма дает не точный результат


если ты пытаешься осуществлять коммуникацию с каким-то прецизионным дивайсом, то многозадачная ОС - изначально неверный выбор, для этой цели существуют риэл-тайм ОС


RapTor   (2004-07-08 11:25:00) [6]

To :Digitman ©
>>это не ты ли там в облике Раптора №1...
Вообщето нет.
>>что ж за форсаж-то такой...
Да ничего особенного не воротил. Но есть таймер в микросекундах.
Без реалтайма дает не точный результат. Вот и все.
Экстренный выход сделать надо но не могу въехать как.


Digitman   (2004-07-08 08:33:00) [7]


> RapTor


это не ты ли там в облике Раптора №1 в "Сетях" про "сокет в компоненте" ? уж больно похоже по стилю изложения глубокой мысли - "не канает", "не пашет" ...


> Выносить в отдельный поток мне слегка не удобно


))


Digitman   (2004-07-08 08:08:00) [8]


> RapTor ©   (07.07.04 22:30) [5]


> Так надо


ну надо так надо
тогда не жди, что кто-то не имеющий ни кванта времени сможет обработать прерывания клавиатуры


> без форсажа не обойтись


что ж за форсаж-то такой страшный ? прямо таки заинтриговал ...


RapTor   (2004-07-07 22:30:00) [9]

То: Игорь Шевченко.
Так надо. К сожалению, без форсажа не обойтись.


Игорь Шевченко   (2004-07-07 21:41:00) [10]


> SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
> SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);


Сам из под себя (а заодно и из-под потока клавиатурного ввода) табуретку вышибаешь. Нафига, спрашивается ?


RapTor   (2004-07-07 20:31:00) [11]

Спасибо Digitman ©
Сделал if PeekMessage Все путем. Выносить в отдельный поток мне слегка не удобно.

Может еще подскажешь...
У меня перед циклом
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Делается. Так надо, к сожалению.
И не срабатывает тогда if PeekMessage.
Что можно сделать?

P.S. Собственно из за этого я и читал порты на прямую.


Digitman   (2004-07-07 18:32:00) [12]

можно и иначе, без доп.потока, но суть - та же

в тело цикла вставь проверку :

if PeekMessage(Msg, MyForm.Handle, WM_KEYDOWN, WM_KEYDOWN, PM_NOREMOVE) and Msg.wParam = вирт_код_клавиши_Esc then
.. нажата ..
else
.. не нажата


Digitman   (2004-07-07 18:18:00) [13]

заведи некую глобальную флаговую переменную
перед началом цикла флаг
стартуй доп.код.поток, в котором будет крутиться твой страшный цикл
в теле цикла проверяй этот флаг, поднятое его состояние есть искомое условие

взведение флага возложи на обработчик события Application.OnMessage(), где будут отслеживаться сообщения типа WM_KEYDOWN и в случае факта нажатия Esc будет взводиться этот флаг


Наверх

Титульная страница Поиск, карта сайта Написать письмо