using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Diagnostics; namespace Chop.Game.Rooms { internal class RoomWorker { private const byte MAX_ROOMS_PER_THREAD = 50; private List mRooms = new List(MAX_ROOMS_PER_THREAD); private Thread mRunner; private bool mAlive = true; private static readonly object mLocker = new object(); internal bool IsFull { get { return (mRooms.Count == MAX_ROOMS_PER_THREAD); } } internal bool IsEmpty { get { return (mRooms.Count == 0); } } internal bool Add(Room room) { if (mRooms.Contains(room) || mRooms.Count == MAX_ROOMS_PER_THREAD) return false; lock (mLocker) { mRooms.Add(room); } return true; } internal bool Remove(Room room) { if (!mRooms.Contains(room)) return false; lock (mLocker) { mRooms.Remove(room); } return true; } internal bool Contains(Room room) { return mRooms.Contains(room); } internal void Start() { mRunner = new Thread(new ThreadStart(Run)) {Name = "Room worker", Priority = ThreadPriority.Normal}; mRunner.Start(); } internal void Stop() { if(!mAlive || mRunner == null || !mRunner.IsAlive) return; mAlive = false; while (mRunner.IsAlive) { } FreeResources(); } private void Run() { short sleepTime = 500;// (short)Core.Config.GetInt("game.room.run.sleep"); //Stopwatch watch; while (mAlive) { //watch = Stopwatch.StartNew(); lock (mLocker) { foreach (Room room in mRooms) { room.Run(); } } //watch.Stop(); //if (watch.ElapsedMilliseconds > sleepTime) // continue; Thread.Sleep(sleepTime); } } private void FreeResources() { mRooms = null; mRunner = null; } } }