簡體   English   中英

在C#中使用計時器線程

[英]Using a timer thread in C#

我正在做一個需要某種系統時鍾的應用程序,它需要計算滴答聲。 我應該能夠獲得計數值並進行設置。

我已經使用Python語言中的Thread庫完成了此操作,但對於C#中的Timer類卻無法做同樣的事情。 作為.NET的新手,我不確定此計時器類如何工作。 我希望能夠使用.NET來實現相同的時鍾。

這是我的Python代碼,因此您可以了解我在說什么。

class SystemClock(threading.Thread):

  def __init__(self , timeUnit , sched):
      self.val = 0

      self.unit = timeUnit
      self.stp= False
      self.sched = sched
      threading.Thread.__init__(self)

  def run(self):
      while not self.stp:
          self.val +=1
          time.sleep(self.unit)

  def getSystemTime(self):
      return self.val

  def stop(self):
      self.stp = True

我感謝您的幫助;

為什么不只使用System.Diagnostics.Stopwatch ,因為這正是它的用途。

// at the start of your program
Stopwatch SystemClock = Stopwatch.StartNew();

// any time you want to see how much time has elapsed
long ticks = SystemClock.ElapsedTicks;

如果確實需要設置該值,則將其包裝在具有base_time值(以滴答為單位)的類中,然后將經過的滴答添加到基准時間中以獲得所需的時間。

是否有任何原因為什么您不只是在開始時檢索DateTime,並根據需要使用DateTime.Now.Subtract(origDateTime)來獲取值,並根據需要使用TimeSpan結果? 還是每次更新都會更新某些內容?

編輯此外,與計時器一樣,您可以設置“滴答”間隔,因此您無需休眠它們。 每次滴答都會執行回調,從而省去了使用...睡眠的麻煩。 但是在綁定領域時,它幾乎沒有綁定,而且由於使用定時器,我已經無法驗證了,您可能需要鎖定要修改的變量,因為它在單獨的線程中,所以什么也沒有確保另一種方法不會改變相同的值。

EDITv3

這是編輯的版本3。 您有兩個類,都避免使用計時器(您的CPU稍后會感謝我;-p) SystemClock是典型的每秒間隔時間。 VariableSystemClock允許您指定增加的速率。 我還更改了從屬性到方法獲取值的方法,甚至使用了繼承。 ;-)

SystemClock.cs

public class SystemClock
{
    protected DateTime _start;

    public SystemClock()
    {
        this._start = DateTime.UtcNow;
    }

    public virtual Int32 getSystemTime()
    {
        return Convert.ToInt32(Math.Floor(DateTime.UtcNow.Subtract(this._start).TotalSeconds));
    }
}

VariableSystemClock.cs

public class VariableSystemClock : SystemClock
{
    private TimeSpan _interval;

    public VariableSystemClock(TimeSpan interval)
        : base()
    {
        this._interval = interval;
    }

    public override Int32 getSystemTime()
    {
        Double ellapsed = DateTime.UtcNow.Subtract(this._start).Ticks / this._interval.Ticks;
        return Convert.ToInt32(Math.Floor(ellapsed));
    }
}

program.cs(因此您可以在控制台應用程序中進行測試(project-> new-> console應用程序)

class Program
{
    static void Main(string[] args)
    {
        SystemClock oncePerSecond = new SystemClock();
        VariableSystemClock oncePerInterval = new VariableSystemClock(TimeSpan.FromSeconds(2));

        Console.WriteLine("Start:");
        Console.WriteLine("  oncePerSecond:   {0}", oncePerSecond.getSystemTime());
        Console.WriteLine("  oncePerInterval: {0}", oncePerInterval.getSystemTime());
        Console.WriteLine();

        for (Int32 i = 0; i < 10; i++)
        {
            // sleep three seconds
            System.Threading.Thread.Sleep(TimeSpan.FromSeconds(2));

            // display output
            Console.WriteLine("Interval {0}:", i);
            Console.WriteLine("  oncePerSecond:   {0}", oncePerSecond.getSystemTime());
            Console.WriteLine("  oncePerInterval: {0}", oncePerInterval.getSystemTime());
            Console.WriteLine();
        }

        Console.WriteLine("End:");
        Console.WriteLine("  oncePerSecond:   {0}", oncePerSecond.getSystemTime());
        Console.WriteLine("  oncePerInterval: {0}", oncePerInterval.getSystemTime());
        Console.WriteLine();
    }
}

隨時可以使用一次afterPerInterval構造和for循環中的Sleep。

線程計時器可能更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM