2013-05-25 35 views
0

我收到一封含有“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); 
    } 
} 
+0

你什么时候调用这个方法? – bpoiss

+1

您的方法会启动秒表,然后立即测量秒表的运行时间 - 这显然不是很长时间,因为您刚开始秒表。 – dtb

+0

@dtb,当我得到下一个“1”时应该停止。这正是我想要实现的。我已经提出了一个停止的条件。但显然不工作。 – FeliceM

回答

0

感谢您的意见和建议我结束了这个解决方案。我还简化了使用返回和一些浮点变量的方法以获得更高的准确性。 这一个正在为我的应用程序工作。

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; 
    } 
} 

我想感谢Mattew他给了我的大力帮助。

2

您需要将CalcolaRPM()方法外围绕保持一个秒表,如果你想一次情况插图中调用它。

最简单的事情做的是将其添加为在类的私人领域。

另一个问题是,当​​不是“1”时,您需要返回最后一个已知RPM - 我们可以通过将最后一个已知RPM保留在专用字段中来解决该问题。

而另一个问题是,RPM计算的第一次,也不能因为没有时间前述将其与比较准确。我们将通过返回-1解决此问题,直到我们有正确的时间进行报告。

而接下来,您要计算经过RPM为整数计算。现在想象一下,如果事情稍微有点过了,那么经过的时间总是999毫秒。只有一毫秒,但你的RPM = 999/1000的计算结果为零。

您有几种选择,但最有可能的是:

  • 返回双代替。
  • 将值四舍五入为最接近的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); 
     } 
    } 
} 
+0

由于秒表在任意时间启动,初始计算往往不准确。 – HABO

+0

我想我们应该在第一次计算时返回-1,因为这总是不准确的。我会更新。 –

+0

@MthetheWWatson,谢谢你,但即使字符串giriRicevuti每1秒更新一次,RPM仍然为0。我已经检查了一个断点。此外,我对传入的串行消息进行过滤,检测“1”并将其传递给此方法,因此没有其他类型的值传递给它。 – FeliceM