经过的时间没有给我预期的结果
本文关键字:结果 时间 经过 | 更新日期: 2023-09-27 18:15:33
我每隔几秒收到一个包含"1"的字符串。我试图得到接收到的字符串和下一个返回经过的时间之间的时间。我做错了什么。我得到的结果是0,而字符串恰好每秒更新一次,所以我应该读取1。我很确定逻辑上有错误,但我看不出它在哪里。这应该运行几个小时,每次我得到字符串"giriRicevuti"的更新时都会更新。
class Rpm
{
public void CalcolaRPM(string giriRicevuti, out long RPM)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
if (giriRicevuti == "1")
{
stopWatch.Stop();
}
long duration = stopWatch.ElapsedMilliseconds;
RPM =(duration/1000);
}
}
如果你想在调用之间对进行计时,你需要在CalcolaRPM()
方法外面放置一个秒表。
最简单的方法是将其作为私有字段添加到类中。
另一个问题是,当giriRicevuti
不是"1"时,您将需要返回最后一个已知的RPM -我们可以通过将最后一个已知的RPM保存在私有字段中来解决这个问题。
另一个问题是,第一次计算RPM时,它不可能是准确的,因为没有之前的时间来比较它。我们将通过返回-1
来解决这个问题,直到我们有一个正确的报告时间。
接下来,您将以整数计算方式计算经过的RPM。现在想象一下,如果事情稍微有点不对劲,那么经过的时间总是999毫秒。只有一毫秒,但是你计算RPM = 999/1000的结果是0。
您有几个选项,但最有可能的是:
- 返回双精度值。
- 将值四舍五入到最接近的RPM。
我选择四舍五入。RPM计算不正确,所以我同时纠正它:
lastRPM = (int) Math.Round(60000.0/((int) stopWatch.ElapsedMilliseconds));
把这些放在一起,这里是一个可编译的测试程序(控制台应用程序):
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Threading;
namespace Demo
{
class Rpm
{
private Stopwatch stopWatch = new Stopwatch();
private int lastRPM = -1;
// RPM will be -1 until we have received two "1"s
public int CalcolaRPM(string giriRicevuti)
{
if (giriRicevuti == "1")
{
if (stopWatch.IsRunning)
lastRPM = (int) Math.Round(60000.0/((int) stopWatch.ElapsedMilliseconds));
stopWatch.Restart();
}
return lastRPM;
}
}
class Program
{
void run()
{
test(900);
test(1000);
test(1100);
test(500);
test(200);
}
void test(int interval)
{
Rpm rpm = new Rpm();
for (int i = 0; i < 10; ++i)
{
Thread.Sleep(interval);
rpm.CalcolaRPM("0");
rpm.CalcolaRPM("1").Print();
rpm.CalcolaRPM("2");
}
}
static void Main()
{
new Program().run();
}
}
static class DemoUtil
{
public static void Print(this object self)
{
Console.WriteLine(self);
}
public static void Print(this string self)
{
Console.WriteLine(self);
}
public static void Print<T>(this IEnumerable<T> self)
{
foreach (var item in self) Console.WriteLine(item);
}
}
}
感谢您的评论和建议,我最终得到了这个解决方案。我还简化了使用返回和一些浮动变量的方法,以获得更高的精度。这是我的应用程序工作。
class Turns
{
static DateTime prevTimeInstance = DateTime.Now;
static float RPM = 0;
public float Counts(int getTurn)
{
TimeSpan currentTimeSpan = TimeSpan.Zero;
if (getTurn.Equals(1))
{
currentTimeSpan = DateTime.Now.Subtract(prevTimeInstance);
prevTimeInstance = DateTime.Now;
if (currentTimeSpan.TotalSeconds != 0)
RPM = 60.0f / (float)currentTimeSpan.TotalSeconds;
}
return RPM;
}
}
我要感谢matthew给了我很大的帮助。