我的網誌清單

2013年7月29日 星期一

State Machine 狀態機

狀態模式

狀態機制 這一個在有很多同樣處理的單一介面

但有很多不同處理的邏輯時 , 非常好用的一個模式 , 也是我以前寫 Work Flow  流程時 一直
在尋找解決方案 , 但一直沒有這樣用的方式
那時還不曉得有這個方式可以用 , 這個模式可以把程式,切成一小塊一小塊的邏輯去處理


舉個例假設在寫一個遊戲 ,當  HP  減少到 2/1 時 應該做的邏輯 , 或減少到 3/1時應該做的邏輯

或遇到什麼怪物時做什麼事 , 這樣零零總總的事 , 我們不應該 if else  這樣去寫

因為這樣會讓程式之後不容易維護 , 也更難分工處理

狀態模式的解決方式是把程式分成一個個處理物件去處理














類似底下這樣的做法 , 可以一層層把邏輯給分散出去 , 進而導到
每個邏輯 , 就是一個單純的區塊管理
public class StateMachine {
 
  /*
    可以用來參考或共用的資料 , 在流程上會用到的
  */
   public  object personData{set;get;}

  /*
   用來存取狀態
 */
  public  HandleLogicState State{set; private get ;}

  public void doWork(){
      State.doWork(this);
}
 

}


狀態模型的本質 :根據狀態來分離和選擇行為

他的優點是 對於相依狀態的  if - else  , 理論上來講可以用狀態模式來實現
那麼就可以把判斷移到處理類別中,從中減少if  - else 避免巨大的條件判斷式

更進一步的分離狀態和行為 , 以及有更好的礦充性

2013年7月28日 星期日

Thread 應用 生產者 與 消費者模式

生產者 與 消費者 模式 

這個模式在執行緒應用時是用來解決 大量資料需要被處理時 的一個機制

而這個機制通常是使用  Quene 來解決 , 因為 Quene 在多執行緒 存取資料時

遇到的瓶頸問題會較少

當生產者 產生待處理物件到一個資料量時

消費者有足夠的時間空間去處理時,會生產者那

那裡要資料處理,然後生產者的製造是一直持續不斷 , 這個模式的優點是 , 把生產及消費二條產線給分開處理,在程式設計上,變的更單純也更容易處錯

2013年7月25日 星期四

C++ LIST 鏈結串列

這篇 原文連結
    http://www.codeofhonor.com/blog/avoiding-game-crashes-related-to-linked-lists

這篇作者寫了一個 介入式雙向鏈結串列

之前我在寫 C++ 時我的鏈結管理都是用傳統資料結構的作法
  寫一個  
     struct    然後用指標去關連 , 一層層接下去

如圖所示,但這樣的話有幾個問題是,當你在移除時,效率就不會太好,你必需先找到那一個
然後再移除他,然後再把線給接回來

但原本這樣在資料數量不多時,其實影響的程度也不會有多大影響
不過這次因為我是要用在多執行緒的部份,
所以可能的情況下會有幾個行為會有影響

A緒行緒,一直加入物件

B執行緒,一直不斷循環物件做事情

C.執行緒.判斷事件做刪除物件

在這樣的情況下我剛好在尋找解決方案

這位作者寫的  List.h 可以解決我的這部份問題


第一他刪除物件時,鏈結不用再手動接回來,只要直接 delete 就可以

再來是他處理相關鏈結的方法有支援滿多的

比如
TestClass *gg = Tss.Head();
這樣就可以取得串列的開頭

 employees.InsertTail(joe); 
這樣就可以把串列加在最尾巴

  delete honda;
刪除之後鏈結的關係不會中斷

2013年7月15日 星期一

C++ DLL 設計

最近因為需要用到 DLL 的部份 , 也因為之前我有用 OPENGL 寫過一套繪圖的 LIB

但因為沒有把他弄成 DLL 也一直想找時間把他再整理一次 , 所以這次思考了一下怎麼

設計 DLL , 當時在寫那套繪圖 LIB  時, 只是想找如何把東西做出來, 並沒有去思考如何

寫的更有架構 , 也因為當時只有我一人在做開發 , 但如果多人開發 , 那個東西會有問題

底下是我去找一些文章,然後整理過學到的東西

1.開放介面給使用者  , 然後提供一個入口 , 去實做這個物件再給使用者,
   這個入口要請使用者傳入版本資訊 , 如果這個DLL  版本不對,就回傳失敗

這是給使用者的 .h 檔
class TESTDLL
{
public :
    virtual int CALL   ADD(int   value) = 0;
};

extern "C"{  EXPORT TESTDLL* CALL TestCreate(int ver); }


2.然後我們在  TestCreate 的程式是

TESTDLL* CALL TestCreate(int ver)
{
      /*這裡要判斷版本對不對*/

    return (TESTDLL*) TESTDLL_Impl::_Interface_Get();
}

然後 _Interface_Get 再去產生我們實際的  DLL 物件





2013年7月11日 星期四

如何用程式解析寫一個四則運算?

如何用程式 寫一個 類似    4+5*6+4+(4*5)
去解析這樣的東西呢?

這個就需要一點巧思 , 其實我也有去參考一些文件及 看一些書才了解的

會想寫這個東西是因為,之前這個東西寫過好幾次,但寫過之後,又要再回想,然後好像腦袋沒有很顥像的畫面,想想乾脆把他寫出文章,之後記憶也比較深刻



首先需要幾個東西

1.取得解析字串
2.取得解析字串類型
   類型有
       運算式字符    "+-*/()="
       數字    0~9  還有小數點

目前就這二個類型

首先流程是

  A.  先開始解析字串  取得 是什麼類型 ,然後如果是數字 一開始也得到一組數字

  B.
                 進入  + - 的運算 , 然後進入這個函式的一開時
                 再進入   *  /  的函式   , 然後一樣進入 * / 的函式的一開始

                 再進入 判斷  開頭是否有   + 或 - 的運算式 , 比如 -5 * 4
                 
                 然後再判斷是否有   "(" 開頭      , 如果有 再進入 判斷  +- 的函式
               
                 然後  +- 跟 */ 再進入判斷運算時 還要再往下一個運算走一次

           
也就是 比如

     4+5*3

    一開始我們  取得 4
    然後進入  +- 判斷 再進入*/  再進入判斷開頭是否有+-  然後再進入 判斷是否有  (

  然後 接下來我們取得  +
 
   然後再回到    判斷是否有  (   , 回到   開頭是否有 +-  回到  */  但沒有
  再回到 +- 有  , 這時   我們存下運算子 + ,   再取得運算式 ,  然後 我們又再一次進入  判斷是否有 */

  然後 又再跑一次   剛剛的流程   , 重複 最後運算 , 得到結果


         

2013年7月10日 星期三

觀察數據時真的用圖來表示比較清楚



不管是壓力測試 , 或者是效能調效

都要有一張圖來表示勝過一切


之前寫了一個調查執行記憶體記錄 的非常有用

在有些時後我們要查一些比較細的問題時 , 這樣非常好用

遠端桌面的軟體的實現



有時我們想要自己寫一個遠端的監控程式 , 去監看對方的營幕時

我們該如何做呢?

之前有思考過這個問題 , 剛剛有稍微研究實現了一下我的想法

確實是可行的 , 我們可以截取桌面的畫面 , 截取下來之後 存在記憶體

再傳到遠方的客戶端 , 我有試過 , 大約 每二秒 或一秒 傳一次畫面

確實是順利的!! 

如何用 C# 判斷程式是否當掉?

最近有一個需求,我寫的監控伺服器的程式

有時程式掛掉並不知道,所以必需寫一個程式來判斷

因為原本我就有寫程式監控記憶體,跟執行緒了

所以我只是在我原本的監控程式裡再加功能而己所以還算容易


這個程式必需增加二個功能 ( 我認為必需要有二個功能)

1.伺服器是否當掉了(在某個節點當住,導至無回應)

2.伺服器消失了

這個是我的主功能畫面




然後因為我有記錄執行檔名稱




//這裡是判斷伺服器是否當掉
   Process[] check;
  check= Process.GetProcessesByName(執行檔名稱);

 if (check[0].Responding)
{
    //代表程式還有回應
}
else
{//程式無回應
    
}


判斷伺服器是否消失也很簡單,就檢查   Process 裡是否有這隻執行檔存在就可以了

接下我會貼我的象棋麻將的  AI DEMO