【发布时间】:2018-03-06 18:25:14
【问题描述】:
我正在开发一个应用程序,用户可以在该应用程序中看到某些内容,并且必须通过单击键盘上的某个键来做出反应。反应时间至关重要,越准确越好。
我只写了几行代码来测试默认设置:
namespace Test
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private Stopwatch sw;
public MainWindow()
{
InitializeComponent();
sw = new Stopwatch();
sw.Start();
this.KeyDown += OnKeyDown;
}
private void OnKeyDown(object sender, KeyEventArgs keyEventArgs)
{
sw.Stop();
lbl.Content = sw.ElapsedMilliseconds;
sw.Restart();
}
}
}
lbl 只是一个简单的标签。
奇怪的是,当我按下例如空格并按住它时,lbl 的值会在 30-33 的范围内变化。
所以我无法预测响应准确度是多少?是否不可能有例如 1 毫秒的精度?用户点击空间,同时(例如 1 毫秒精度)我可以在事件处理程序中处理它吗?
主要问题是:
假设我有一个按键事件处理程序:
Test_KeyDown(object sender, KeyEventArgs keyEventArgs)
{
time = stopwatch.elapsed();
stopwatch.Restart();
}
可能出现的“时间”的最小值是多少?我可以确定时间值精确到 1 毫秒吗? 在这种方法中,我启动了秒表,但是我必须等待 - 多长时间 - 才能刷新 GUI?
【问题讨论】:
-
不知道你想在那里测量什么,也不知道你是怎么做的。
KeyDown在按键按下时不会连续升起(我猜是KeyPress),所以按住空格键不应该多次更新标签,是吗?如果您的意思是在显示窗口之前按住空格键,那么您可以在构造函数之间对代码进行基准测试,直到窗口最终处于活动状态并泵送事件。 -
据我所知,调度事件的速度尽可能快,并且与任何其他 Windows 应用程序的工作方式几乎相同:按下的键由操作系统处理,然后调度一个消息到您的窗口消息队列,然后将其泵入并在焦点控件上引发相应的事件。与人类的反应时间相比,准确性已经足够好,除非您在 UI 线程上执行工作。
-
按键的速度将取决于 Windows 配置的按键重复率。 windows.microsoft.com/is-is/windows-xp/help/…
-
@Tony:那不是
KeyPress吗? -
不同的键盘/硬件也会有不同的延迟率。例如,无绳键盘的每次按键延迟都比 USB 高。然后是笔记本电脑键盘(集成)、PS/2、蓝牙、适配器延迟(例如 PS/2 到 USB)等。所以,你的问题是关于准确性,但是,我不确定软件应用程序可以做到这一点“准确”。除了上面的按键注释之外,还有您正在与之竞争的 windows 值:superuser.com/questions/388160/…