首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计时器滞后

计时器滞后
EN

Stack Overflow用户
提问于 2011-12-30 23:20:06
回答 3查看 1.4K关注 0票数 1

我想在我的应用程序中有一个运行计时器,它显示经过的秒数到小数点后2位,例如2.31秒。为此,我使用了System.Threading.Timer,并将Timer对象设置为每10毫秒调用一次refreshTimeBox()函数(因为我希望秒数一直到小数点后两位)。但是,计时器滞后了。随着时间的推移,它越来越落后。我猜是因为refreshTimeBox()花了太长时间才能完成。但是,我也尝试了每100毫秒调用一次refreshTimeBox()。计时器仍然滞后。唯一的区别是,与我使用10毫秒作为间隔的情况相比,在这种情况下,延迟在更长的时间后变得明显。我有以下代码来初始化计时器:

代码语言:javascript
复制
timer = new Timer(refreshTimeBox, null, 0, 10);

以下是refreshTimeBox的代码

代码语言:javascript
复制
public void refreshTimeBox(object param)
{
    time += 0.01f;
    Dispatcher.BeginInvoke(WriteTimeBox);
}

以下是WriteTimeBox的代码

代码语言:javascript
复制
public void WriteTimeBox()
{
    TimeBar.Text = time.ToString("0.00");
}

time是存储经过时间的变量,TimeBar是正在更新的文本框。

我想要一个尽可能精确的计时器。请帮我弄一下这个。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-30 23:23:34

如果您想要显示自过去某个特定事件以来所经过的时间量,那么最好的方法是将时间存储在“时间零”,例如startTime,然后在您的计时器事件中,通过从当前时间减去startTime并显示差值来计算所经过的时间。

您不能依赖于以精确的时间间隔发送计时器事件。这不是一个实时系统。除此之外,您应该注意到,BeginInvoke可能会请求在与当前线程不同的线程上进行方法调用,并且不同的线程可能无法在当前时间分派该方法调用。

票数 3
EN

Stack Overflow用户

发布于 2011-12-30 23:33:13

你也可以用秒表

代码语言:javascript
复制
        System.Diagnostics.Stopwatch sw=new System.Diagnostics.Stopwatch();
        sw.Start();

在update函数中

代码语言:javascript
复制
        TimeBar.Text = sw.ElapsedMilliseconds;

这样你就不必担心UTC的问题了

票数 3
EN

Stack Overflow用户

发布于 2011-12-30 23:24:11

计时器总是有滞后的可能。你需要做的是存储你开始的时间,然后将它与当前时间进行比较。

代码语言:javascript
复制
private DateTime startTime;
public void startTimer() {
    startTime = DateTime.Now;
}

public void refreshTimeBox(object param)
{
    Dispatcher.BeginInvoke(WriteTimeBox);
}

public void WriteTimeBox()
{
    TimeSpan ts = DateTime.Now - startTime;
    // See http://msdn.microsoft.com/en-us/library/1ecy8h51.aspx for TimeSpan formatting.
    TimeBar.Text = ts.time.ToString("s.ff");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8680952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档