- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试开发简单的计时器,它可以保存它的最后一个值并在新的应用程序启动时从它继续。
Stopwatch
类不可序列化,甚至无法初始化以便从特定时间启动。但效果很好。基准显示秒表的 1 分钟是真的 1 分钟。
我尝试按以下方式使用 TimeSpan
:
private TimeSpan timerNew = new TimeSpan();
private DispatcherTimer dispatcherTimer = new DispatcherTimer();
public MainWindow()
{
InitializeComponent();
dispatcherTimer.Interval = TimeSpan.FromSeconds(1);
dispatcherTimer.Tick += Timer_Tick;
}
private void Timer_Tick(object sender, EventArgs e)
{
timerNew += new TimeSpan(0, 0, 0, 1);
TbTimer.Text = String.Format("{0:00}:{1:00}:{2:00}",
timerNew.Hours, timerNew.Minutes, timerNew.Seconds);
}
private void ButtonStart_OnClick(object sender, RoutedEventArgs e)
{
dispatcherTimer.Start();
}
private void ButtonStop_OnClick(object sender, RoutedEventArgs e)
{
dispatcherTimer.Stop();
}
private void ButtonReset_OnClick(object sender, RoutedEventArgs e)
{
timerNew = new TimeSpan();
TbTimer.Text = "00:00:00";
}
当我对照真正的秒表检查时,我发现这个计时器实现每分钟损失 2 秒。
我还尝试了我自己的 Timer 实现,它是一个带有 ulong
字段的简单类,它在每个 dispatcherTimer tick 时递增。并且UI展示了秒到小时、分钟等转换后的结果。但与真正的秒表相比,它每分钟也会损失 2 秒。
为什么这 2 秒会丢失?什么是 Stopwatch
的替代品,用于可自定义的计时器?
最佳答案
Windows 线程调度程序不是“实时”调度程序,因为 Windows 不是“实时操作系统”。换句话说,所有的计时和调度都是在“尽力而为”的基础上完成的,没有任何精确度的保证。此外,这总是会导致时间损失,因为您可以保证的是不会提前安排时间。所以当出现不精确的时候,总是往“晚”的方向发展。
Stopwatch
类之所以有效,是因为它使用了 CPU 支持的性能计数器,而不依赖于操作系统调度程序。硬件本身会跟踪耗时并提供您需要的信息。
我建议反对使用DateTime.UtcNow
来测量耗时,原因有二:首先,DateTime
使用的时钟是可调的,因此即使使用 UTC 时间(至少可以补偿由于夏令时而导致的自动调整)也不能保证准确。其次,您的具体情况似乎涉及到您想要序列化当前状态并恢复它的问题,DateTime.UtcNow
无论如何都没有解决。
相反,您应该创建自己的可序列化秒表类,该类使用 Stopwatch
本身作为基础,但它存储您添加到 Stopwatch
的基本经过值' s 经过值。
例如:
class SerializableStopwatch
{
public TimeSpan BaseElapsed { get; set; }
public TimeSpan Elapsed { get { return _stopwatch.Elapsed + BaseElapsed; } }
private Stopwatch _stopwatch = new Stopwatch();
// add whatever other members you want/need from the Stopwatch class,
// simply delegating the operation to the _stopwatch member. For example:
public void Start() { _stopwatch.Start(); }
public void Stop() { _stopwatch.Stop(); }
// etc.
}
如何准确地序列化上述内容取决于您。在最简单的情况下,您可以将 Elapsed
属性格式化为字符串来保存值,然后当您要恢复对象时,解析该值,创建上述类的新实例,然后将该值分配给 BaseElapsed
属性。
有关该主题的更多讨论,您可能会找到 Eric Lippert 的博客文章 Precision and accuracy of DateTime有用且有趣。
关于c# - 带 TimeSpan 的计时器和自制计时器比秒表慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28398358/
我正在使用Delphi 7,并且有一个新单元要在我的项目中使用。我已经编译了新的。当我尝试通过将其添加到uses子句在项目中使用此单元时,出现错误,提示未找到.dcu文件。我还尝试将文件的完整路径放在
我有一个项目正在使用 mysql_connect()。 (我无法将其更改为 mysqli) 我收到错误:Call to undefined function mysql_connect() 我已经使用
我现在正在学习 jQuery,第一个“更大”的项目是一个自制的 Accordion /滑动导航。 我的 HTML 代码如下所示: Prologue TEST Projekte
我得到了这段用 JavaScript 编写的代码,但是对于大输入它返回了错误的数字。 它应该用模(mo)计算指数(ex)幂的底数。 我用 C 编写了等效代码并且正在运行。请有人告诉我出了什么问题。 尝
我正在通读 How can I write a power function myself? dan04 给出的答案引起了我的注意,主要是因为我不确定 fortran 给出的答案,但我接受了它并实现了
更新:可能是 jQuery 的 trigger() 在测试中做了一些额外的工作,我打开了一个 issue在 github 上。 ===== 我正在关注 learnQuery构建我的简单 jQuery。
我尝试了各种图库插件,但没有一个适合我的需要。 我有一些标记如下:
为了熟悉 swift 语言和 Cocoa,我决定创建一个小的基数转换,首先从基数 2 到基数 10,然后我想添加一些其他基数,例如 16 和 5。我仍然无法使其正常工作:Running App Vie
我开始编写自己的 vector 类,然后着手重载 = 运算符。我在下面有类似 somevector = someothervector 的代码,尽管我不确定它是否正确,因为我一直在为类似 someve
这里有一些非常相似的问题,但是它们无法帮助我解决这个问题。 另外,我提供了完整的示例代码,因此其他人可能更容易理解。 我制作了一个 vector 容器(出于内存原因,不能使用STL),过去只将oper
我制作了自己的 vector 模板,operator[]一部分: template T& vector::operator[](unsigned int index) { return m_
我们知道我们不应该写 SELECT *;相反,应该写下确实将在业务逻辑中使用的列(例如,在有关整篇文章的一次查询中SELECT blog_title, blog_content,以及SELECT bl
我使用 netbeans,当我准备为应用程序用户的管理创建一个 bean 时,我开始想知道:哪种方式更有益,保留数据库表并在其上应用 EJB,还是创建一个处理与数据库的连接并“手动”进行测试的 bea
所以基本上,作为安全措施(和学习过程),我尝试做的是我自己的“Capthca”系统。发生的情况是我有 20 个“标签”(为简洁起见,下面仅显示一个),每个 ID 都在 1 到 20 之间。我的 jav
我有一个类,它本质上是一个 std::vector具有一些附加功能。类(class)有find(const T& value )返回 value 第一次出现索引的方法或-1: int my::find
最近几天,我一直在尝试使用 Python 进行一些音频开发。 问题是,Mac OSX 不能很好地处理卸载问题。实际上,没有办法卸载任何东西。一旦它出现在您的系统上,您最好祈祷它没有做任何有趣的事情。因
我不明白以下错误消息,但我知道我之前已经在 Linux 上安装了 utf8-light ,没有出现任何问题。有人可以阐明出了什么问题吗?这是 LLVM 问题、GHC 7 问题还是 utf8-light
我是一名优秀的程序员,十分优秀!