/// <summary> /// 运行时间片(具有均衡负载的时间片处理) /// </summary> internal static void Slice() { bool bIsSliceOK = false; do { // 总是先处理完高优先级 if (s_CallHighestCount < CALL_SLICE_MAX_COUNT) { bIsSliceOK = Slice_Highest(); if (bIsSliceOK == true) { s_CallHighestCount++; break; } } if (s_CallAboveNormalCount < CALL_SLICE_MAX_COUNT) { bIsSliceOK = Slice_AboveNormal(); if (bIsSliceOK == true) { s_CallAboveNormalCount++; break; } } if (s_CallNormalCount < CALL_SLICE_MAX_COUNT) { bIsSliceOK = Slice_Normal(); if (bIsSliceOK == true) { s_CallNormalCount++; break; } } if (s_CallBelowNormalCount < CALL_SLICE_MAX_COUNT) { bIsSliceOK = Slice_BelowNormal(); if (bIsSliceOK == true) { s_CallBelowNormalCount++; break; } } if (s_CallLowestCount < CALL_SLICE_MAX_COUNT) { bIsSliceOK = Slice_Lowest(); if (bIsSliceOK == true) { s_CallLowestCount++; break; } } // 如果没有需要处理的则再检测调用的次数是否已满 if (s_CallHighestCount >= CALL_SLICE_MAX_COUNT) { s_CallHighestCount = 0; bIsSliceOK = Slice_Highest(); if (bIsSliceOK == true) { break; } } if (s_CallAboveNormalCount >= CALL_SLICE_MAX_COUNT) { s_CallAboveNormalCount = 0; bIsSliceOK = Slice_AboveNormal(); if (bIsSliceOK == true) { break; } } if (s_CallNormalCount >= CALL_SLICE_MAX_COUNT) { s_CallNormalCount = 0; bIsSliceOK = Slice_Normal(); if (bIsSliceOK == true) { break; } } if (s_CallBelowNormalCount >= CALL_SLICE_MAX_COUNT) { s_CallBelowNormalCount = 0; bIsSliceOK = Slice_BelowNormal(); if (bIsSliceOK == true) { break; } } if (s_CallLowestCount >= CALL_SLICE_MAX_COUNT) { s_CallLowestCount = 0; bIsSliceOK = Slice_Lowest(); if (bIsSliceOK == true) { break; } } } while (false); if (bIsSliceOK == true) { // 如果已经处理完,再发一次事件消息,让下一个线程来处理下一个时间片优先级的调用 OneServer.SetAllWorldSignal(); } }
/// <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(); }
/// <summary> /// Timer的主要处理函数,用来计算是否需要处理的时候了 /// </summary> private static void RunMobileAIThread() { // 向服务程序注册有新的线程在内部运行 OneServer.BeginRegisterThread(); LOGs.WriteLine(LogMessageType.MSG_INFO, "AI系统: 处理AI系统的主线程已启动!"); //long l_iIndex = 0; bool l_bLoaded = false; DateTime l_nowDateTime = DateTime.Now; while (OneServer.Closing == false) { s_Signal.WaitOne(10, false); // 服务已经关闭则退出 if (OneServer.Closing) { break; } // 百分比输出显示 if (s_IsDumpInfo) { s_IsDumpInfo = false; InternalDumpInfo(); } // 先处理改变了优先级的时间片集合 ProcessChangeQueue(); l_bLoaded = false; //// 8种时间片 //for ( l_iIndex = 0; l_iIndex < 8; l_iIndex++ ) //{ // l_nowDateTime = DateTime.Now; // // 如果小于下一次处理的时间片就跳出 // if ( l_nowDateTime < s_NextPriorities[l_iIndex] ) // break; // // 设置下一次处理的时间片 // s_NextPriorities[l_iIndex] = l_nowDateTime + s_PriorityDelays[l_iIndex]; // foreach ( TimeSlice timeSlice in s_Timers[l_iIndex] ) // { // // 如果当前时间片已经处理过,已不在先入先出的集合中,并且当前的时间大于下一次调用的时间 // if ( timeSlice.InQueued == false && l_nowDateTime > timeSlice.NextTime ) // { // // 表示将当前的时间片已经加入先入先出集合中 // TimeSlice.JoinProcessQueue( timeSlice ); // l_bLoaded = true; // // 如果运行次数大于等于当前的时间片的运行数量话就停止(如果只运行一次的话就马上调用停止,下次运行将从列表中移去,因为已经加入了TimeSlice.s_TimeSliceQueue集合所以会调用一次的) // if ( timeSlice.Count != 0 && ( timeSlice.SetAdding( timeSlice.Adding + 1 ) >= timeSlice.Count ) ) // timeSlice.Stop(); // else // timeSlice.SetNextTime( l_nowDateTime + timeSlice.IntervalTime ); // 计算下次调用的时间 // } // } //} if (l_bLoaded) { OneServer.SetAllWorldSignal(); } } // 向服务程序注册创建的新线程已结束 OneServer.EndRegisterThread(); }
public void SetAllWorldSignalTest() { OneServer.SetAllWorldSignal(); Assert.Inconclusive("无法验证不返回值的方法。"); }