[英]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.