智能預判 (二:最初的佈局)

不太會畫圖,先簡單看下 程序流程,他比 其餘 服務器 多了 一個 單獨的 線程 內部數據庫 物理運算,也就是  他的運算 不須要 客戶端  時時給信息。sql

下面是 片斷代碼。數據庫

 

            var bootstrap = BootstrapFactory.CreateBootstrap();

            if (!bootstrap.Initialize())
            {
                Console.WriteLine("沒法初始化");
                Console.ReadKey();
                return;
            }

            var result = bootstrap.Start();

            Console.WriteLine("服務器啓動: {0}!", result);

            if (result == StartResult.Failed)
            {
                Console.WriteLine("沒法啓動");
                Console.ReadKey();
                return;
            }

            Console.WriteLine("線程池開啓!");

            ThreadPoolMain.OnStartThreadPool();

  

        public static void OnStartThreadPool()
        {
            cs = "server=127.0.0.1;database=playgame;user=sa;pwd=zzjzzj888;pooling=true;min pool size=10;max pool size=10000";
            OnSqlHelper = new SqlHelper(cs);

            //新建ManualResetEvent對象而且初始化爲無信號狀態
            ManualResetEvent eventX = new ManualResetEvent(false);
            ThreadPool.SetMaxThreads(12, 12); //線程池  
            ThreadQueue Queue = new ThreadQueue();


            while (OnReadSql()>0)
            {
                Console.WriteLine("結束並修改數據庫!!");
                Queue.QueueWorkItem(eventX, taskcount);//分配任務
                eventX = new ManualResetEvent(false);  
            } 
        }

        static int taskcount;
        //讀取數據庫,若是沒符合條件 等待後繼續讀取
        static int OnReadSql()
        {
            // 讀取數據庫數據,拿到最新的 當前時間點 以內  的數據。
            //排序這列數據。
            taskcount = sqls();//任務數量 
            if (taskcount == 0)
            {
                Thread.Sleep(11);//若是沒有數據,則2秒鐘後繼續尋找
                OnReadSql();
            }
            return taskcount;
        }
        public bool QueueWorkItem(ManualResetEvent eventX, int task)
        {
            Console.WriteLine("主線程運行開始");
            Thread.Sleep(1000);
            ThreadProcClass t = new ThreadProcClass(task, eventX);
            for (int i = 0; i < task; i++)
            {
                JsonData json = new JsonData();
                json["name"] = "zzj" + i;
                json["message"] = "ok" + i;
                ThreadPool.QueueUserWorkItem(new WaitCallback(t.ThreadProc), new SomeState(json));
            }
            //等待事件的完成,即線程調用ManualResetEvent.Set()方法
            //eventX.WaitOne  阻止當前線程,直到當前 WaitHandle 收到信號爲止。 
            eventX.WaitOne(Timeout.Infinite, true);
            return true;
        }
        public ThreadProcClass(int count, ManualResetEvent mre)
        {
            iMaxCount = count;
            eventX = mre;
        }

        public static int iCount = 0;
        public static int iMaxCount = 0;
        public ManualResetEvent eventX;
        public void ThreadProc(object i)
        {
            Console.WriteLine("Thread " + ((SomeState)i).json.ToJson());
            Thread.Sleep(1111);
            //Interlocked.Increment()操做是一個原子操做,做用是:iCount++ 具體請看下面說明 
            //原子操做,就是不能被更高等級中斷搶奪優先的操做。你既然提這個問題,我就說深一點。
            //因爲操做系統大部分時間處於開中斷狀態,
            //因此,一個程序在執行的時候可能被優先級更高的線程中斷。
            //而有些操做是不能被中斷的,否則會出現沒法還原的後果,這時候,這些操做就須要原子操做。
            //就是不能被中斷的操做。
            Interlocked.Increment(ref iCount);
            if (iCount == iMaxCount)
            {
                //   Console.WriteLine("最後一個子線程發出結束信號!");
                //將事件狀態設置爲終止狀態,容許一個或多個等待線程繼續。
                iCount = 0;
                eventX.Set();
            }
        }
相關文章
相關標籤/搜索