C# 测量keydown和keyup事件之间的时间
我试图捕获C# 测量keydown和keyup事件之间的时间,c#,c#-4.0,C#,C# 4.0,我试图捕获KeyDown和keydup之间的计时(以毫秒为单位),这两个事件之间为每个键入的字符花费的时间,我使用了Stopwatch.GetTimestamp(),因为我需要获取高分辨率的时间戳,如下面的编码所示,我想知道这是否是以毫秒为单位计算时间的正确公式: int timestampinmilisons=Convert.ToInt32(elapsedTicks*1000000/秒表频率)用于以毫秒为单位获取时间 因为计时结果没有显示任何一致性,并且在这两个事件之间可能达到5秒,这是不现实
KeyDown
和keydup
之间的计时(以毫秒为单位),这两个事件之间为每个键入的字符花费的时间,我使用了Stopwatch.GetTimestamp()
,因为我需要获取高分辨率的时间戳,如下面的编码所示,我想知道这是否是以毫秒为单位计算时间的正确公式:
int timestampinmilisons=Convert.ToInt32(elapsedTicks*1000000/秒表频率)代码>用于以毫秒为单位获取时间
因为计时结果没有显示任何一致性,并且在这两个事件之间可能达到5秒,这是不现实的
public partial class Form1 : Form
{
long timeStamp;
long initialTimeStamp;
public Form1()
{
InitializeComponent();
Stopwatch stopWatch = new Stopwatch();
// Uses the second Core or Processor for the Test
// Prevents "Normal" processes from interrupting Threads
// Prevents "Normal" Threads
initialize();
}
public void initialize()
{
//
}
public void textBox1_KeyDown(object sender, KeyEventArgs e)
{
initialTimeStamp = Stopwatch.GetTimestamp();
}
public void textBox1_KeyUp(object sender, KeyEventArgs e)
{
timeStamp = Stopwatch.GetTimestamp();
long elapsedTicks = timeStamp -initialTimeStamp;
int timeStampInMiliseconds = Convert.ToInt32(elapsedTicks * 1000000 / Stopwatch.Frequency);
}
}
非常感谢你的帮助 更好的方法是使用StopWatch.elapsedmillesons
属性
在文本框1\u KeyDown
事件处理程序中,只需按如下方式重新启动秒表:
stopWatch.Restart();
long timeStampInMiliseconds = stopWatch.ElapsedMilliseconds;
public partial class Form1 : Form
{
long timeStamp;
long initialTimeStamp;
Stopwatch stopWatch;
public Form1()
{
InitializeComponent();
stopWatch = new Stopwatch();
....
}
....
}
在textBox1\u KeyUp
事件处理程序中,像这样读取elapsedmillesons
属性:
stopWatch.Restart();
long timeStampInMiliseconds = stopWatch.ElapsedMilliseconds;
public partial class Form1 : Form
{
long timeStamp;
long initialTimeStamp;
Stopwatch stopWatch;
public Form1()
{
InitializeComponent();
stopWatch = new Stopwatch();
....
}
....
}
您还需要将秒表
设置为如下实例变量:
stopWatch.Restart();
long timeStampInMiliseconds = stopWatch.ElapsedMilliseconds;
public partial class Form1 : Form
{
long timeStamp;
long initialTimeStamp;
Stopwatch stopWatch;
public Form1()
{
InitializeComponent();
stopWatch = new Stopwatch();
....
}
....
}
更好的方法是使用StopWatch.elapsedmillesons
属性
在文本框1\u KeyDown
事件处理程序中,只需按如下方式重新启动秒表:
stopWatch.Restart();
long timeStampInMiliseconds = stopWatch.ElapsedMilliseconds;
public partial class Form1 : Form
{
long timeStamp;
long initialTimeStamp;
Stopwatch stopWatch;
public Form1()
{
InitializeComponent();
stopWatch = new Stopwatch();
....
}
....
}
在textBox1\u KeyUp
事件处理程序中,像这样读取elapsedmillesons
属性:
stopWatch.Restart();
long timeStampInMiliseconds = stopWatch.ElapsedMilliseconds;
public partial class Form1 : Form
{
long timeStamp;
long initialTimeStamp;
Stopwatch stopWatch;
public Form1()
{
InitializeComponent();
stopWatch = new Stopwatch();
....
}
....
}
您还需要将秒表
设置为如下实例变量:
stopWatch.Restart();
long timeStampInMiliseconds = stopWatch.ElapsedMilliseconds;
public partial class Form1 : Form
{
long timeStamp;
long initialTimeStamp;
Stopwatch stopWatch;
public Form1()
{
InitializeComponent();
stopWatch = new Stopwatch();
....
}
....
}
更好的方法是使用StopWatch.elapsedmillesons
属性
在文本框1\u KeyDown
事件处理程序中,只需按如下方式重新启动秒表:
stopWatch.Restart();
long timeStampInMiliseconds = stopWatch.ElapsedMilliseconds;
public partial class Form1 : Form
{
long timeStamp;
long initialTimeStamp;
Stopwatch stopWatch;
public Form1()
{
InitializeComponent();
stopWatch = new Stopwatch();
....
}
....
}
在textBox1\u KeyUp
事件处理程序中,像这样读取elapsedmillesons
属性:
stopWatch.Restart();
long timeStampInMiliseconds = stopWatch.ElapsedMilliseconds;
public partial class Form1 : Form
{
long timeStamp;
long initialTimeStamp;
Stopwatch stopWatch;
public Form1()
{
InitializeComponent();
stopWatch = new Stopwatch();
....
}
....
}
您还需要将秒表
设置为如下实例变量:
stopWatch.Restart();
long timeStampInMiliseconds = stopWatch.ElapsedMilliseconds;
public partial class Form1 : Form
{
long timeStamp;
long initialTimeStamp;
Stopwatch stopWatch;
public Form1()
{
InitializeComponent();
stopWatch = new Stopwatch();
....
}
....
}
更好的方法是使用StopWatch.elapsedmillesons
属性
在文本框1\u KeyDown
事件处理程序中,只需按如下方式重新启动秒表:
stopWatch.Restart();
long timeStampInMiliseconds = stopWatch.ElapsedMilliseconds;
public partial class Form1 : Form
{
long timeStamp;
long initialTimeStamp;
Stopwatch stopWatch;
public Form1()
{
InitializeComponent();
stopWatch = new Stopwatch();
....
}
....
}
在textBox1\u KeyUp
事件处理程序中,像这样读取elapsedmillesons
属性:
stopWatch.Restart();
long timeStampInMiliseconds = stopWatch.ElapsedMilliseconds;
public partial class Form1 : Form
{
long timeStamp;
long initialTimeStamp;
Stopwatch stopWatch;
public Form1()
{
InitializeComponent();
stopWatch = new Stopwatch();
....
}
....
}
您还需要将秒表
设置为如下实例变量:
stopWatch.Restart();
long timeStampInMiliseconds = stopWatch.ElapsedMilliseconds;
public partial class Form1 : Form
{
long timeStamp;
long initialTimeStamp;
Stopwatch stopWatch;
public Form1()
{
InitializeComponent();
stopWatch = new Stopwatch();
....
}
....
}
您不需要使用秒表
。使用以下方法获取时间戳要容易得多:
long t = DateTime.Now.Ticks;
试试这个:
public void textBox1_KeyDown(object sender, KeyEventArgs e)
{
initialTimeStamp = DateTime.Now.Ticks;
}
public void textBox1_KeyUp(object sender, KeyEventArgs e)
{
timeStamp = DateTime.Now.Ticks;
long elapsedTicks = timeStamp - initialTimeStamp;
long timeStampInNanoseconds = elapsedTicks * 100;
}
为了获得更高的精度,我以纳秒为单位,但如果您愿意,可以将其转换为毫秒:
long timeStampInMiliseconds = elapsedTicks / 10000;
您不需要使用秒表
。使用以下方法获取时间戳要容易得多:
long t = DateTime.Now.Ticks;
试试这个:
public void textBox1_KeyDown(object sender, KeyEventArgs e)
{
initialTimeStamp = DateTime.Now.Ticks;
}
public void textBox1_KeyUp(object sender, KeyEventArgs e)
{
timeStamp = DateTime.Now.Ticks;
long elapsedTicks = timeStamp - initialTimeStamp;
long timeStampInNanoseconds = elapsedTicks * 100;
}
为了获得更高的精度,我以纳秒为单位,但如果您愿意,可以将其转换为毫秒:
long timeStampInMiliseconds = elapsedTicks / 10000;
您不需要使用秒表
。使用以下方法获取时间戳要容易得多:
long t = DateTime.Now.Ticks;
试试这个:
public void textBox1_KeyDown(object sender, KeyEventArgs e)
{
initialTimeStamp = DateTime.Now.Ticks;
}
public void textBox1_KeyUp(object sender, KeyEventArgs e)
{
timeStamp = DateTime.Now.Ticks;
long elapsedTicks = timeStamp - initialTimeStamp;
long timeStampInNanoseconds = elapsedTicks * 100;
}
为了获得更高的精度,我以纳秒为单位,但如果您愿意,可以将其转换为毫秒:
long timeStampInMiliseconds = elapsedTicks / 10000;
您不需要使用秒表
。使用以下方法获取时间戳要容易得多:
long t = DateTime.Now.Ticks;
试试这个:
public void textBox1_KeyDown(object sender, KeyEventArgs e)
{
initialTimeStamp = DateTime.Now.Ticks;
}
public void textBox1_KeyUp(object sender, KeyEventArgs e)
{
timeStamp = DateTime.Now.Ticks;
long elapsedTicks = timeStamp - initialTimeStamp;
long timeStampInNanoseconds = elapsedTicks * 100;
}
为了获得更高的精度,我以纳秒为单位,但如果您愿意,可以将其转换为毫秒:
long timeStampInMiliseconds = elapsedTicks / 10000;
请记住,同时按下两个键或使用修改器键将破坏此功能。例如,按住Control键,然后按另一个键,然后松开Control键。除了caesay的注释之外,调试会使结果更加有趣,因为如果您单步执行代码,您会得到可能会有巨大延迟的事件。@caesay@Alexei Levenkov:谢谢您的回答,您能为错误提出解决方案吗。thanks@Zaid很难从样品中看出你到底想做什么,也很难看出什么测量实际上失败了。当前代码应该测量两个最近的向下/向上对之间的间隔,但据我所知,同一个键不需要。当你得到“事件间隔5秒”时,找出并更新带有案例的帖子,可能需要有人提供答案。(你也可以考虑问一个单独的问题,比如“当你发现的精确条件{下/升事件间隔5秒”)。记住,同时按下两个键,或者使用一个修改键将打破这个问题。例如,按住Control键,然后按另一个键,然后松开Control键。除了caesay的注释之外,调试会使结果更加有趣,因为如果您单步执行代码,您会得到可能会有巨大延迟的事件。@caesay@Alexei Levenkov:谢谢您的回答,您能为错误提出解决方案吗。thanks@Zaid很难从样品中看出你到底想做什么,也很难看出什么测量实际上失败了。当前代码应该测量两个最近的向下/向上对之间的间隔,但据我所知,同一个键不需要。当你得到“事件间隔5秒”时,找出并更新带有案例的帖子,可能需要有人提供答案。(你也可以考虑问一个单独的问题,比如“当你发现的精确条件{下/升事件间隔5秒”)。记住,同时按下两个键,或者使用一个修改键将打破这个问题。例如,按住Control键,然后按另一个键,然后松开Control键。除了caesay的注释之外,调试会使结果更加有趣,因为如果您单步执行代码,您会得到可能会有巨大延迟的事件。@caesay@Alexei Levenkov:谢谢您的回答,您能为错误提出解决方案吗。thanks@Zaid很难从样品中看出你到底想做什么,也很难看出什么测量实际上失败了。当前代码应该测量两个最近的向下/向上对之间的间隔,但据我所知,同一个键不需要。当你得到“事件间隔5秒”时,找出并更新带有案例的帖子,可能需要有人提供答案。(也可以考虑问单独的问题。