время удерживания клавиши
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
-
- Сообщения: 25
- Зарегистрирован: 28 апр 2009, 15:15
здравствуйте, обращаюсь к вам со следующим вопросом. нужно измерить время удерживания клавиши. как это сделать?
я так понимаю надо во время события KeyDown по компоненту textBox включить таймер, чтобы пошёл отчёт времени, а когда будет отпущена (KeyUp), таймер остановить и вычесть из последнего времени первое. это верно? или может надо событие KeyPress использовать?
как засекать время? есть какая-нить WinAPI функция для этого?
я так понимаю надо во время события KeyDown по компоненту textBox включить таймер, чтобы пошёл отчёт времени, а когда будет отпущена (KeyUp), таймер остановить и вычесть из последнего времени первое. это верно? или может надо событие KeyPress использовать?
как засекать время? есть какая-нить WinAPI функция для этого?
ппц изврат....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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
-
- Сообщения: 25
- Зарегистрирован: 28 апр 2009, 15:15
хм. вроде работает, но только часто показывает одинаковые значения... не верится, что такое возможно...ладно бы если в секундах, а тут измеряется в процессорных тактах (100-наносекунды)
468750
781250
156250
312500
937500
468750
937500
937500
1718750
937500
781250
это слово в 11 букв (время на каждую)
какие мысли?
468750
781250
156250
312500
937500
468750
937500
937500
1718750
937500
781250
это слово в 11 букв (время на каждую)
какие мысли?
Теоретически это неверно, ибо после нажатия кнопки, событие попадает в очередь событий и сколько оно там провисит, пока будет вызвана обработка, одному богу известно(
-
- Сообщения: 25
- Зарегистрирован: 28 апр 2009, 15:15
а как управлять этой очередью? можно же поставить максимальный приоритет, чтобы выполнялось сразу жеТеоретически это неверно, ибо после нажатия кнопки, событие попадает в очередь событий и сколько оно там провисит, пока будет вызвана обработка, одному богу известно(
Да всё будет нормально. Это я просто теоретически предположил. На самом деле в Windows отдан приоритет событиям ввода (мышь и клавиатура) и когда поток проверяет что там у него в очереди сообщений, WM_KEYDOWN(UP) будут отбработы в первую очередь.
-
- Сообщения: 25
- Зарегистрирован: 28 апр 2009, 15:15
ну всё равно. как это сделать? может и не для этого случая, просто знать на будущее. раз вопрос этот затронут, то когда-нить опять всплывёт...
заранее спасибо)
заранее спасибо)
Бред. Когда событие попадёт в обработчик, часть времени уже пройдёт. Причём, время реакции на события up и down может здорово не совпасть, на разницу будет ошибка. Тебе надо в обих обработчиках прочитать из самих сообщений, если там есть такая инфа, время их отправки и вычесть. А если если в сообщениях такой инфы нет, то задача нерешаема.BattleMage писал(а):здравствуйте, обращаюсь к вам со следующим вопросом. нужно измерить время удерживания клавиши. как это сделать?
я так понимаю надо во время события KeyDown по компоненту textBox включить таймер, чтобы пошёл отчёт времени, а когда будет отпущена (KeyUp), таймер остановить и вычесть из последнего времени первое. это верно? или может надо событие KeyPress использовать?
как засекать время? есть какая-нить WinAPI функция для этого?
Здесь время просто округлено не до единиц, а до большего числа, так что вполне возможно. Если измерять время в пикосекундах, округлять результат до триллионов, а само время будет различаться на сотни миллисекунд, то результаты тоже совпадут." писал(а): 468750
781250
156250
312500
937500
468750
937500
937500
1718750
937500
781250
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
О чём спор!? Начнём с того, что кнопки нажимаются человеком а не автоматом, поэтому говорить о пико/нано секундах и времени простоя сообщения в очереди не корректно. atavin-ta, вы ещё не учли время реакции клавишной пружины и силу трения пластиковых частей, а эти параметры у каждой кнопки своиatavin-ta писал(а):Бред. Когда событие попадёт в обработчик, часть времени уже пройдёт.
