我正在做一个需要某种系统时钟的应用程序,一个计算滴答的时钟。我应该能够得到计数值并设置它。
我在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
感谢您的帮助;
答案 0 :(得分:3)
为什么不使用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
值(以刻度表示)的类中,然后将经过的刻度添加到基准时间以获得时间想。
答案 1 :(得分:1)
为什么你不只是在开始时检索一个DateTime,并且根据需要获得该值,是否有任何理由使用DateTime.Now.Subtract(origDateTime)
并使用TimeSpan结果来满足您的需求?或者每次滴答都会更新一些内容吗?
修改强> 此外,与Timers一样,您设置了“Tick”间隔,因此您无需将它们休眠。每个tick都会执行回调,省去了使用while ... sleep的麻烦。但裸线绑定,而在线程领域,我无法验证因为我已经使用了定时器已经有一段时间了,你可能需要锁定()你正在修改的变量,因为它在一个单独的线程中,因为没有什么是确保另一种方法不会改变相同的值。
<强> 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-&gt; new-&gt;控制台应用程序)
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();
}
}
随意使用oncePerInterval结构和for循环中的Sleep。
答案 2 :(得分:0)
Thread Timers可能更适合您的目标。