예제 #1
0
 public void InvokeSkipped(float time)
 {
     MusicController.Seek(time);
     OnSkipped?.Invoke(time);
 }
예제 #2
0
        private void Loop()
        {
            _nextWakeUpTickTime = Stopwatch.GetTimestamp();

            try
            {
                while (true)
                {
                    _nextWakeUpTickTime += _cycleTimeInTicks;

                    while (true)
                    {
                        long ticks = _nextWakeUpTickTime - Stopwatch.GetTimestamp();
                        if (ticks <= 0L)
                        {
                            break;
                        }
                        long diff = (ticks * 1000) / Stopwatch.Frequency; // cycle in milliseconds

                        if (diff >= 100)
                        {
                            Thread.Sleep(20);
                        }
                        else if (diff >= 40)
                        {
                            Thread.Sleep(10);
                        }
                        else if (diff >= 25)
                        {
                            Thread.Sleep(2);
                        }
                        else if (diff >= 15)
                        {
                            Thread.Sleep(1);
                        }
                        else if (diff >= 5)
                        {
                            Thread.SpinWait(200);
                        }
                        else if (diff > 1)
                        {
                            Thread.SpinWait(100);
                        }
                        else
                        {
                            Thread.SpinWait(10);
                        }
                    }

                    long lDelay = Stopwatch.GetTimestamp() - _nextWakeUpTickTime;

                    if (lDelay < _MaxDelayInTicks)
                    {
                        OnTimer?.Invoke(null, null);
                    }
                    else
                    {
                        OnSkipped?.Invoke(null, null);
                    }
                }
            }
            catch (ThreadInterruptedException) { }
            catch (Exception) { Console.WriteLine("Exiting timer thread."); }

            OnStoped?.Invoke(null, null);
        }