Exemple #1
0
        public void Add(ITriggerHandler <T> handler)
        {
            if (isRunning)
            {
                if (waitHandler == null)
                {
                    waitHandler = handler;
                    return;
                }

                if (waitQueue == null)
                {
                    waitQueue = new MinimumQueue <ITriggerHandler <T> >(4);
                }
                waitQueue.Enqueue(handler);
                return;
            }

            if (singleHandler == null)
            {
                singleHandler = handler;
            }
            else
            {
                if (handlers == null)
                {
                    handlers = new ITriggerHandler <T> [4];
                }

                // check empty
                for (int i = 0; i < handlers.Length; i++)
                {
                    if (handlers[i] == null)
                    {
                        handlers[i] = handler;
                        return;
                    }
                }

                // full, ensure capacity
                var last = handlers.Length;
                {
                    EnsureCapacity(ref handlers);
                    handlers[last] = handler;
                }
            }
        }
		/// <summary>Add Cancellation Triggers on destroy</summary>
		public void AddCancellationTriggerOnDestory(CancellationTokenSource cts) {
			if (called) {
				cts.Cancel();
				cts.Dispose();
			}

			if (canellationTokenSourceOrQueue == null) {
				canellationTokenSourceOrQueue = cts;
			} else if (canellationTokenSourceOrQueue is CancellationTokenSource c) {
				var q = new MinimumQueue<CancellationTokenSource>(4);
				q.Enqueue(c);
				q.Enqueue(cts);
				canellationTokenSourceOrQueue = q;
			} else {
				((MinimumQueue<CancellationTokenSource>)canellationTokenSourceOrQueue).Enqueue(cts);
			}
		}
Exemple #3
0
        public LogicLooper(TimeSpan targetFrameTime, int initialActionsCapacity = 16)
        {
            _targetFrameRate             = 1000 / targetFrameTime.TotalMilliseconds;
            _looperId                    = Interlocked.Increment(ref _looperSequence);
            _ctsLoop                     = new CancellationTokenSource();
            _ctsAction                   = new CancellationTokenSource();
            _targetFrameTimeMilliseconds = (int)targetFrameTime.TotalMilliseconds;
            _registerQueue               = new MinimumQueue <LooperAction>(10);
            _runLoopThread               = new Thread(StartRunLoop)
            {
                Name         = $"{typeof(LogicLooper).Name}-{_looperId}",
                IsBackground = true,
                Priority     = ThreadPriority.AboveNormal,
            };
            _shutdownTaskAwaiter = new TaskCompletionSource <bool>();
            _actions             = new LooperAction[initialActionsCapacity];

            _runLoopThread.Start(this);
        }