CommandDesk.cs 1.61 KB
using OS.Spin.Common.MultiThread;
using OS.Spin.Modle.Command;
using System.Collections.Generic;
using System.Threading;

namespace OS.Spin.Commands
{
    public class CommandDesk
    {
        private static CommandDesk _cDk;
        private static readonly object ObjLock = new object();
        private SemaphorePool _semaphorePool;

        private Thread _runThread;
        private Queue<CommandKey> _commandKeys = new Queue<CommandKey>();
        public static CommandDesk GetInstance()
        {
            lock (ObjLock)
            {
                return _cDk ?? (_cDk = new CommandDesk());
            }
        }

        private CommandDesk()
        {
            // 申请信号量
            _semaphorePool =  OS.Spin.Common.MultiThread.SemaphorePool.GetInstance();

            _semaphorePool.MakeSemaphore(OS.Spin.Running.Infos.Names.S_COMMAND_RUN);

            if (null == _runThread)
            {
                _runThread = new Thread(Run);
                _runThread.Start();
            }
        }

        private void Run()
        {
            while (true)
            {
                _semaphorePool.Wait(OS.Spin.Running.Infos.Names.S_COMMAND_RUN);

                if (_commandKeys.Count > 0)
                {
                    // 获取指令
                    var key = _commandKeys.Dequeue();

                    // 执行指令
                    //DoExcute(key);
                }
            }
        }

        public void Execute(CommandKey key)
        {
            _commandKeys.Enqueue(key);
            _semaphorePool.Release(OS.Spin.Running.Infos.Names.S_COMMAND_RUN);
        }
    }
}