Пример #1
0
 public void InternalRun()
 {
     while (_isStart)
     {
         CmdTask task = _queue.Dequeue(1);
         if (task == null)
         {
             continue;
         }
         var systemIdx = task.TaskInfo.SystemIdx;
         try
         {
             SingletonManager.Get <DurationHelp>().ProfileStart(_systemsProfiles[systemIdx]);
             var sytstem = _systems[systemIdx];
             sytstem.ExecuteUserCmd(task.Owner, task.UserCmd);
             _logger.DebugFormat("{0} Execute :{1} seq:{2} player:{3}", Name, systemIdx, task.UserCmd.Seq,
                                 task.Owner.OwnerEntityKey.EntityId);
         }
         catch (Exception e)
         {
             _logger.ErrorFormat("Execute :{0} Exception:{1}", _systems[systemIdx], e);
         }
         finally
         {
             SingletonManager.Get <DurationHelp>().ProfileEnd(_systemsProfiles[systemIdx]);
             _disparcher.TaskEnd(task);
         }
     }
 }
Пример #2
0
        public void TaskEnd(CmdTask cmdTask)
        {
            var idx = cmdTask.PayerIdx;

            Interlocked.Decrement(ref _taskRunCounts[idx]);
            _logger.DebugFormat("{0} TaskEnd :{1} statue:{1}", idx, cmdTask.TaskInfo.SystemIdx, _taskRunCounts[idx]);
        }
Пример #3
0
 private void DispatchTask(CmdTask task)
 {
     if (task.TaskInfo.Thread == TaskThread.MainThread)
     {
         _mainThread.Offer(task);
     }
     else
     {
         _slaveThreads[task.ThreadIdx].Offer(task);
     }
 }
Пример #4
0
 public void Offer(CmdTask task)
 {
     _queue.Enqueue(task);
 }
Пример #5
0
        protected override void Run()
        {
            Thread.CurrentThread.Name = GetType().ToString();
            while (Running)
            {
                if (IsStart)
                {
                    try
                    {
                        int  count     = _userCount;
                        bool isAllDone = true;
                        for (int playerIdx = 0; playerIdx < count; playerIdx++)
                        {
                            var queue = _taskDictionary[playerIdx];
                            if (_taskRunCounts[playerIdx] == 0 && queue.Count == 0) //提交的任务和队列的任务个数都为0
                            {
                                continue;
                            }

                            isAllDone = false;

                            if (_taskRunCounts[playerIdx] == 0)
                            {
                                bool       flag          = true;
                                int        lastThreadIdx = -1;
                                TaskThread lastThread    = TaskThread.END;
                                int        batchCount    = 0;
                                bool       hasTask       = false;
                                while (flag)
                                {
                                    flag = false;

                                    if (queue.Count > 0)
                                    {
                                        CmdTask task = (CmdTask)queue.Peek();
                                        hasTask = true;
                                        if (lastThread == TaskThread.END)
                                        {
                                            lastThread    = task.TaskInfo.Thread;
                                            lastThreadIdx = task.ThreadIdx;
                                        }

                                        if (task.TaskInfo.Thread == lastThread && task.ThreadIdx == lastThreadIdx)
                                        {
                                            batchCount++;
                                            flag = true;
                                            task = (CmdTask)queue.Dequeue();

                                            Interlocked.Increment(ref _taskRunCounts[playerIdx]);

                                            _logger.DebugFormat("Offer :{0} thread:{1} batch{2} _taskRunCounts{3}",
                                                                task.TaskInfo.SystemIdx, task.TaskInfo.Thread, batchCount,
                                                                _taskRunCounts[playerIdx]);
                                            DispatchTask(task);
                                        }
                                    }
                                }

                                if (!hasTask)
                                {
                                    _logger.DebugFormat("{0} no more tasks", playerIdx);
                                }
                            }
                        }

                        if (isAllDone)
                        {
                            NotifyALlThreadAllDone();
                            IsStart = false;
                        }
                    }
                    catch (Exception e)
                    {
                        _logger.ErrorFormat("{0}", e);
                        NotifyALlThreadAllDone();
                        IsStart = false;
                    }
                }
                else
                {
//                    NotifyALlThreadAllDone();
//                    isStart = false;
                    Thread.Sleep(1);
                }
            }
        }