![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите победить тетю клаву [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 будет взводиться этот флаг