예제 #1
0
 private static void StartTextBoxBlinker(TimedAction timedAction, TRef <int> blinkerCounter)
 {
     timedAction.Reset(() =>
     {
         // The blinker is on falf of the time and events such as input
         // changes can reset the blinker.
         var value = Volatile.Read(ref blinkerCounter.Value);
         value     = (value + 1) % (2 * TextBoxBlinkThreshold);
         Volatile.Write(ref blinkerCounter.Value, value);
     }, TextBoxBlinkSleepMilliseconds);
 }
예제 #2
0
        public void Reset(Action action)
        {
            // Create a dedicated cancel token for each task.
            var cancelled = new TRef <bool>(false);

            Reset(new Thread(() =>
            {
                while (!Volatile.Read(ref cancelled.Value))
                {
                    action();
                }
            }), cancelled);
        }
예제 #3
0
        public void Reset(Action <float> action, int totalMilliseconds, int sleepMilliseconds)
        {
            // Create a dedicated cancel token for each task.
            var cancelled = new TRef <bool>(false);

            Reset(new Thread(() =>
            {
                var substepData = new SleepSubstepData(sleepMilliseconds);

                int totalCount     = totalMilliseconds / sleepMilliseconds;
                int totalRemainder = totalMilliseconds - totalCount * sleepMilliseconds;

                if (Volatile.Read(ref cancelled.Value))
                {
                    action(-1);

                    return;
                }

                action(0);

                for (int i = 1; i <= totalCount; i++)
                {
                    if (SleepWithSubstep(substepData, cancelled))
                    {
                        action(-1);

                        return;
                    }

                    action((float)(i * sleepMilliseconds) / totalMilliseconds);
                }

                if (totalRemainder > 0)
                {
                    if (SleepWithSubstep(substepData, cancelled))
                    {
                        action(-1);

                        return;
                    }

                    action(1);
                }
            }), cancelled);
        }
예제 #4
0
        private void Reset(Thread thread, TRef <bool> cancelled)
        {
            lock (_lock)
            {
                // Cancel the current task.
                if (_cancelled != null)
                {
                    Volatile.Write(ref _cancelled.Value, true);
                }

                _cancelled = cancelled;

                _thread = thread;
                _thread.IsBackground = true;
                _thread.Start();
            }
        }
예제 #5
0
        public void Reset(Action action, int sleepMilliseconds)
        {
            // Create a dedicated cancel token for each task.
            var cancelled = new TRef <bool>(false);

            Reset(new Thread(() =>
            {
                var substepData = new SleepSubstepData(sleepMilliseconds);

                while (!Volatile.Read(ref cancelled.Value))
                {
                    action();

                    if (SleepWithSubstep(substepData, cancelled))
                    {
                        return;
                    }
                }
            }), cancelled);
        }
예제 #6
0
        private static bool SleepWithSubstep(SleepSubstepData substepData, TRef <bool> cancelled)
        {
            for (int i = 0; i < substepData.SleepCount; i++)
            {
                if (Volatile.Read(ref cancelled.Value))
                {
                    return(true);
                }

                Thread.Sleep(substepData.SleepMilliseconds);
            }

            if (substepData.SleepRemainderMilliseconds > 0)
            {
                if (Volatile.Read(ref cancelled.Value))
                {
                    return(true);
                }

                Thread.Sleep(substepData.SleepRemainderMilliseconds);
            }

            return(Volatile.Read(ref cancelled.Value));
        }