время удерживания клавиши

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

BattleMage
Сообщения: 25
Зарегистрирован: 28 апр 2009, 15:15

здравствуйте, обращаюсь к вам со следующим вопросом. нужно измерить время удерживания клавиши. как это сделать?
я так понимаю надо во время события KeyDown по компоненту textBox включить таймер, чтобы пошёл отчёт времени, а когда будет отпущена (KeyUp), таймер остановить и вычесть из последнего времени первое. это верно? или может надо событие KeyPress использовать?

как засекать время? есть какая-нить WinAPI функция для этого?
Newbie
Сообщения: 148
Зарегистрирован: 06 сен 2009, 19:45

BattleMage писал(а):здравствуйте, обращаюсь к вам со следующим вопросом. нужно измерить время удерживания клавиши. как это сделать?
я так понимаю надо во время события KeyDown по компоненту textBox включить таймер, чтобы пошёл отчёт времени, а когда будет отпущена (KeyUp), таймер остановить и вычесть из последнего времени первое. это верно? или может надо событие KeyPress использовать?

как засекать время? есть какая-нить WinAPI функция для этого?
ппц изврат....

не проще тогда уже получить время так...
private: System::Void textBox1_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)
{
start = DateTime::Now;
}
private: System::Void textBox1_KeyUp(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e)
{
this->Text = (DateTime::Now - start).ToString();
}

без разницы какой проект... логика одна получить текущее время системы.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Таймер действительно излишен. Достаточно замерить время в WM_KEYDOWN и замерить время в WM_KEYUP, затем посчитать разницу.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
BattleMage
Сообщения: 25
Зарегистрирован: 28 апр 2009, 15:15

хм. вроде работает, но только часто показывает одинаковые значения... не верится, что такое возможно...ладно бы если в секундах, а тут измеряется в процессорных тактах (100-наносекунды)

468750
781250
156250
312500
937500
468750
937500
937500
1718750
937500
781250

это слово в 11 букв (время на каждую)

какие мысли?
_SG
Сообщения: 53
Зарегистрирован: 28 фев 2009, 10:43
Откуда: Севастополь

Теоретически это неверно, ибо после нажатия кнопки, событие попадает в очередь событий и сколько оно там провисит, пока будет вызвана обработка, одному богу известно(
BattleMage
Сообщения: 25
Зарегистрирован: 28 апр 2009, 15:15

Теоретически это неверно, ибо после нажатия кнопки, событие попадает в очередь событий и сколько оно там провисит, пока будет вызвана обработка, одному богу известно(
а как управлять этой очередью? можно же поставить максимальный приоритет, чтобы выполнялось сразу же
_SG
Сообщения: 53
Зарегистрирован: 28 фев 2009, 10:43
Откуда: Севастополь

Да всё будет нормально. Это я просто теоретически предположил. На самом деле в Windows отдан приоритет событиям ввода (мышь и клавиатура) и когда поток проверяет что там у него в очереди сообщений, WM_KEYDOWN(UP) будут отбработы в первую очередь.
BattleMage
Сообщения: 25
Зарегистрирован: 28 апр 2009, 15:15

ну всё равно. как это сделать? может и не для этого случая, просто знать на будущее. раз вопрос этот затронут, то когда-нить опять всплывёт...
заранее спасибо)
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

BattleMage писал(а):здравствуйте, обращаюсь к вам со следующим вопросом. нужно измерить время удерживания клавиши. как это сделать?
я так понимаю надо во время события KeyDown по компоненту textBox включить таймер, чтобы пошёл отчёт времени, а когда будет отпущена (KeyUp), таймер остановить и вычесть из последнего времени первое. это верно? или может надо событие KeyPress использовать?

как засекать время? есть какая-нить WinAPI функция для этого?
Бред. Когда событие попадёт в обработчик, часть времени уже пройдёт. Причём, время реакции на события up и down может здорово не совпасть, на разницу будет ошибка. Тебе надо в обих обработчиках прочитать из самих сообщений, если там есть такая инфа, время их отправки и вычесть. А если если в сообщениях такой инфы нет, то задача нерешаема.
&quot писал(а): 468750
781250
156250
312500
937500
468750
937500
937500
1718750
937500
781250
Здесь время просто округлено не до единиц, а до большего числа, так что вполне возможно. Если измерять время в пикосекундах, округлять результат до триллионов, а само время будет различаться на сотни миллисекунд, то результаты тоже совпадут.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

atavin-ta писал(а):Бред. Когда событие попадёт в обработчик, часть времени уже пройдёт.
О чём спор!? Начнём с того, что кнопки нажимаются человеком а не автоматом, поэтому говорить о пико/нано секундах и времени простоя сообщения в очереди не корректно. atavin-ta, вы ещё не учли время реакции клавишной пружины и силу трения пластиковых частей, а эти параметры у каждой кнопки свои :) .
Ответить