79 lines
2.5 KiB
C#
79 lines
2.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace StgSharp
|
|
{
|
|
public static partial class StgSharp
|
|
{
|
|
private static Stopwatch mainProvider = new Stopwatch();
|
|
private static List<TimeProvider> subscriberList = new List<TimeProvider>();
|
|
private static Thread timeProvideThread;
|
|
private static long accuracy;
|
|
|
|
private static void ProvideTime()
|
|
{
|
|
long totalMS, previousFrameMS = 0,
|
|
internalFrequncy = Stopwatch.Frequency;
|
|
lock (mainProvider)
|
|
{
|
|
mainProvider.Restart();
|
|
}
|
|
while (mainProvider.IsRunning)
|
|
{
|
|
totalMS = mainProvider.ElapsedTicks / (internalFrequncy / (1000L * 1000L));
|
|
foreach (TimeProvider subscriber in subscriberList)
|
|
{
|
|
subscriber.CheckTime(totalMS);
|
|
}
|
|
}
|
|
}
|
|
|
|
[MethodImpl(MethodImplOptions.NoOptimization)]
|
|
public static void TimerActivate(int maxFrameUpdateSensitiveTimeProviderCount)
|
|
{
|
|
if (!mainProvider.IsRunning)
|
|
{
|
|
mainProvider.Start();
|
|
//speed test
|
|
long totalMS, previousSecondMS = 0,
|
|
internalFrequncy = Stopwatch.Frequency;
|
|
for (int i = 0; i < 100; i++)
|
|
{
|
|
totalMS = mainProvider.ElapsedTicks / (internalFrequncy / (1000L * 1000L));
|
|
for (int t = 0; t < 10; t++)
|
|
{
|
|
if (totalMS < 1000)
|
|
{
|
|
subscriberList.Add(new TimeProvider(100L));
|
|
}
|
|
}
|
|
}
|
|
mainProvider.Stop();
|
|
subscriberList.Clear();
|
|
totalMS = (mainProvider.ElapsedTicks / (internalFrequncy / (1000L * 1000L))) / 100L;
|
|
accuracy = totalMS * 2 / 3;
|
|
mainProvider.Reset();
|
|
timeProvideThread = new Thread(new ThreadStart(ProvideTime));
|
|
timeProvideThread.Start();
|
|
}
|
|
}
|
|
|
|
public static void SubscribeTimeProvider(TimeProvider provider)
|
|
{
|
|
}
|
|
|
|
public static void TimerDeactivate()
|
|
{
|
|
lock (mainProvider)
|
|
{
|
|
mainProvider.Stop();
|
|
}
|
|
}
|
|
}
|
|
} |