【问题标题】:Cross-platform high resolution tick counter on Mono?Mono 上的跨平台高分辨率刻度计数器?
【发布时间】:2017-07-14 15:51:02
【问题描述】:

我正在寻找 Mono 上的高分辨率刻度计数器,最好与 Win32/.NET 上的 QueryPerformanceCounter 具有相同的分辨率。

这是否需要在我需要支持的每个平台上实现为本地调用(例如 QueryPerformanceCounter 在 .NET/Win32 上)? (Linux,OSX)。

我需要大约

【问题讨论】:

    标签: c# .net linux macos mono


    【解决方案1】:

    您应该为此使用 System.Diagnostics.Stopwatch。

    【讨论】:

      【解决方案2】:

      在这里查看我的答案: https://stackoverflow.com/a/37882723/5073786

      using Mono.Unix.Native;
      namespace drone.StackOverflow{
      
        internal class LinuxHiResTimer {
          internal event EventHandler Tick; // Tick event 
      
          private System.Diagnostics.Stopwatch watch; // High resolution time
          const uint safeDelay = 0; // millisecond (for slightly early wakeup)
          private Timespec pendingNanosleepParams = new Timespec();
          private Timespec threadNanosleepParams = new Timespec();
          object lockObject = new object();
          internal long Interval { 
              get{
                  double totalNanoseconds;
                  lock (lockObject) {
                      totalNanoseconds= (1e9 * pendingNanosleepParams.tv_sec)
                                               + pendingNanosleepParams.tv_nsec; 
      
      
                  }
                  return (int)(totalNanoseconds * 1e-6);//return value in ms
              } 
              set{
                  lock (lockObject) {
                      pendingNanosleepParams.tv_sec = value / 1000;
                      pendingNanosleepParams.tv_nsec = (long)((value % 1000) * 1e6);//set value in ns
                  }
              }
          }
          private bool enabled;
          internal bool Enabled {
              get { return enabled; }
              set {
                  if (value) {
                      watch.Start();
                      enabled = value;
                      Task.Run(()=>tickGenerator()); // fire up new thread
                  }
                  else {
                      lock (lockObject) {
                          enabled = value;
                      }
                  }
              }
      
          }
          private Task tickGenerator() {
              bool bNotPendingStop; 
              lock (lockObject) {
                  bNotPendingStop = enabled;
              }
              while (bNotPendingStop) {
                  // Check if thread has been told to halt
      
                  lock (lockObject) {
                      bNotPendingStop = enabled;
                  }
                  long curTime = watch.ElapsedMilliseconds;
                      if (curTime >= Interval) {
                          watch.Restart ();
                          if (Tick != null)
                              Tick (this, new EventArgs ());
                      } else {
                          long iTimeLeft = (Interval - curTime); // How long to delay for 
                          if (iTimeLeft >= safeDelay) { // Task.Delay has resolution 15ms//await Task.Delay(TimeSpan.FromMilliseconds(iTimeLeft - safeDelay));
                              threadNanosleepParams.tv_nsec = (int)((iTimeLeft - safeDelay) * 1e6);
                              threadNanosleepParams.tv_sec = 0;
                              Syscall.nanosleep (ref threadNanosleepParams, ref threadNanosleepParams);
                          }
                      }
      
              }
              watch.Stop();
              return null;
          }
      }
      

      用法:

       private myMainFunction(){
        LinuxHiResTimer timReallyFast = new LinuxHiResTimer();
        timReallyFast.Interval=25; // 
        timReallyFast.Tick += new EventHandler(timReallyFast_Tick);
        timReallyFast.Enabled = true;
      }
      private void timReallyFast_Tick(System.Object sender, System.EventArgs e) {
      // Do this quickly i.e. 
       PollSerialPort();
      }
      

      【讨论】:

        猜你喜欢
        • 2010-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-02
        • 1970-01-01
        • 1970-01-01
        • 2011-10-31
        相关资源
        最近更新 更多