コード例 #1
0
        /// <summary>
        /// Timer的主要处理函数,用来计算是否需要处理的时候了
        /// </summary>
        private static void RunTimerThread()
        {
            // 向服务程序注册有新的线程在内部运行
            OneServer.BeginRegisterThread();

            LOGs.WriteLine(LogMessageType.MSG_INFO, LanguageString.SingletonInstance.TimerThreadString007);

            long     iIndex      = 0;
            bool     bLoaded     = false;
            DateTime nowDateTime = DateTime.Now;

            while (OneServer.Closing == false)
            {
                s_Signal.WaitOne(10, false);

                // 服务已经关闭则退出
                if (OneServer.Closing == true)
                {
                    break;
                }

                // 百分比输出显示
                if (s_IsDumpInfo == true)
                {
                    s_IsDumpInfo = false;
                    InternalDumpInfo();
                }

                // 先处理改变了优先级的时间片集合
                ProcessChangeQueue();

                bLoaded = false;

                // 8种时间片
                for (iIndex = 0; iIndex < 8; iIndex++)
                {
                    nowDateTime = DateTime.Now;

                    // 如果小于下一次处理的时间片就跳出
                    if (nowDateTime < s_NextPriorities[iIndex])
                    {
                        break;
                    }

                    // 设置下一次处理的时间片
                    s_NextPriorities[iIndex] = nowDateTime + s_PriorityDelays[iIndex];

                    foreach (KeyValuePair <TimeSlice, TimeSlice> timeSlice in s_Timers[iIndex])
                    {
                        // 如果当前时间片已经处理过,已不在先入先出的集合中,并且当前的时间大于下一次调用的时间
                        if (timeSlice.Value.InQueued == false && nowDateTime > timeSlice.Value.NextTime)
                        {
                            // 表示将当前的时间片已经加入先入先出集合中
                            TimeSlice.JoinProcessQueue(timeSlice.Value);

                            bLoaded = true;

                            // 如果运行次数大于等于当前的时间片的运行数量话就停止(如果只运行一次的话就马上调用停止,下次运行将从列表中移去,因为已经加入了TimeSlice.s_TimeSliceQueue集合所以会调用一次的)
                            if (timeSlice.Value.Count != 0 && ++timeSlice.Value.Adding >= timeSlice.Value.Count)
                            {
                                timeSlice.Value.Stop();
                            }
                            else
                            {
                                timeSlice.Value.NextTime = nowDateTime + timeSlice.Value.IntervalTime; // 计算下次调用的时间
                            }
                        }
                    }
                }

                if (bLoaded == true)
                {
                    OneServer.SetAllWorldSignal();
                }
            }

            // 向服务程序注册创建的新线程已结束
            OneServer.EndRegisterThread();
        }
コード例 #2
0
 /// <summary>
 /// 修改时间片优先级
 /// </summary>
 /// <param name="tTimer"></param>
 /// <param name="newPrio"></param>
 public static void PriorityChange(TimeSlice tTimer, TimerFrequency newPriority)
 {
     Change(tTimer, (long)newPriority, false);
 }
コード例 #3
0
 /// <summary>
 /// 移去时间片
 /// </summary>
 /// <param name="tTimer"></param>
 public static void RemoveTimer(TimeSlice tTimer)
 {
     Change(tTimer, -1, false);
 }
コード例 #4
0
 /// <summary>
 /// 添加或修改或移去时间片
 /// </summary>
 /// <param name="tTimer"></param>
 public static void AddTimer(TimeSlice tTimer)
 {
     Change(tTimer, (long)tTimer.Frequency, true);
 }