Blame view

OS.Spin/OS.Spin.Commands/CommandDesk.cs 1.61 KB
8ca6e89d   Tuo Wenbo   20211021
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
  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);
          }
      }
  }