ICE的工具集基本功能

1、爲了能夠生成一個全局的唯一標示,主要用來在adapter註冊servant的時候需要ID,可以通過該方法獲得一個
    string IceUtil::generateUUID()
2、工具集提供了兩個字符集的轉換函數,主要用於unicode和utf8之間的轉換
    wstring IceUtil::stringToWstring(const string& str, ConversionFlags flags)

   string IceUtil::wstringToString(const wstring& wstr, ConversionFlags flags)

由於ICE的所有字符串的傳輸時基於UTF-8編碼的,因此如果需要使用其他字符編碼方式,可以通過communicator
設置字符轉換對象,系統中有一個ICONV的模板轉換對象:
id.stringConverter = new IconvStringConverter<char>("應用使用的字符集名稱");
具體支持的字符集可以參考iconv的使用說明

3、爲了輸出ICE的相關版本信息,或者打印ICE的依賴版本號,可以引用宏定義
    #define ICE_STRING_VERSION "3.4.2"
    #define ICE_INT_VERSION 30402
4、ICE提供了一個時間管理類IceUtil::Time,主要用來獲取系統時間、定義時間間隔等。提供的主要方法包括:
    static Time now(Clock = Realtime);     // 獲取系統當前時間
    static Time seconds(Int64);            // 構造一個基於秒的時間間隔
    static Time milliSeconds(Int64);       // 構造一個基於微秒的時間間隔
    static Time microSeconds(Int64);       // 構造一個基於毫秒的時間間隔
    Int64 toSeconds() const;               // 轉換成秒
    Int64 toMilliSeconds() const;          // 轉換成微秒
    Int64 toMicroSeconds() const;          // 轉換成毫秒
std::string toDateTime() const;        // 轉換成日期時間串
+、-、*、/、比較操作符
5、工具集提供了定時器和定時任務的實現,可以用來實現定時觸發的任務執行,首先需要定義一個定時任務執行類
    class MyTImerTask : virtual public IceUtil::TimerTask
{
public:
virtual void runTimerTask() = 0;
};
typedef IceUtil::Handle<MyTImerTask> MyTimerTaskPtr;

設置定時器:
MyTimerTaskPtr mytask = new MyTImerTask();
TimerPtr timer = new IceUtil::Timer();
timer->schedule(mytask, IceUtil::Time::seconds(10));           // 10秒後執行任務
timer->scheduleRepeated(mytask, IceUtil::Time::seconds(10));   // 每隔10秒執行一次
timer->cancel(mytask);  // 取消定時器的執行
timer->destory();                                              // 銷燬所有定時器

注意定時器的執行時在另外一個特殊的線程中執行,因此如果在MyTImerTask中有狀態緩存的話,需要考慮多線程互斥訪問的問題
定時器scheduleRepeated的重複執行的間隔是相對於上一次的runTimerTask執行結束後計算而言的
不要試圖將同一個TimerTask的實例註冊到兩個不同的Timer中,否則會有不可預期的結果
一個timer對象只有一個線程,因此同一個timer對象中的多個timertask是順序執行的,這樣可能導致後一個timertask的執行會
依賴於前一個timertask的執行而產生延遲,如果要防止相互的影響,那麼可以定義多個timer對象來解決
定時器timer在調用destroy後會join定時器的執行線程(阻塞式調用),因此後續就不能再次使用定時器來註冊定時任務
6、工具集提供了一個線程對象Thread,需要繼承並實現run方法,調用start方法來啓動線程,返回一個線程控制對象
   class ICE_UTIL_API Thread : virtual public IceUtil::Shared
   {
   public:
        Thread();
        Thread(const std::string&);
        virtual void run() = 0;                       // 需要實現的虛方法
        ThreadControl start(size_t = 0);              // 啓動線程,設置其線程堆棧大小
        ThreadControl start(size_t, int priority);    // 啓動線程,設置其線程堆棧大小和線程優先級
        ThreadControl getThreadControl() const;       // 獲得線程的線程控制對象,可以用來合併和分離線程,或者獲取線程ID
        bool isAlive() const;                         // 判斷線程是否仍舊存活
    };

class ICE_UTIL_API ThreadControl
{
public:
void join();                                   // 合併線程
void detach();                                 // 分離線程
ID id() const;                                 // 獲取線程ID
static void sleep(const Time&);                // 當前線程休眠
static void yield();                           // 釋放當前CPU
};

MyThreadPtr thread = new MyThread();
IceUtil::ThreadControl control = thread->start();
IceUtil::ThreadControl::sleep(IceUtil::Time::seconds(10));
control.join();
7、工具集提供了一個IceUtil::Shared對象,主要用來做智能指針的引用計數用,因此如果需要將一個對象申明智能指針,必須讓其繼承至
    IceUtil::Shared,並通過typedef IceUtil::Handle<class>  classPtr來申明
其handle對象還提供了一個static Handle dynamicCast(const HandleBase<Y>& r)方法進行智能指針間的動態轉換
8、工具集提供一系列的互斥對象,包含如下:
    IceUtil::Mutex (提供了自動解鎖對象:IceUtil::Mutex::Lock,如下方式使用:IceUtil::Mutex::Lock lock(_mutex);)
IceUtil::StaticMutex (可如下定義靜態鎖:static IceUtil::StaticMutex myStaticMutex = ICE_STATIC_MUTEX_INITIALIZER;)
IceUtil::RecMutex (IceUtil::RecMutex::Lock)
IceUtil::RecRWMutex (IceUtil::RWMutex::RLock、IceUtil::RWMutex::WLock)
IceUtil::Monitor<IceUtil::Mutex> (IceUtil::Monitor<IceUtil::Mutex>::Lock、notify、notifyAll)
在這些互斥體的使用過程中,儘量使用遞歸互斥體,因爲可以在一個線程中多次調用,本身相對於普通互斥提在時間和空間消耗上非常小
9、工具集提供了一個用來捕獲系統信號的對象CtrlCHandler,通過其設置一個回調對象用來在進程收到SIGHUP、SIGINT、SIGTERM信號的時候
    回調期對應的函數,其使用方法如下:
void interruptedCallback(int signal)
    {
   // TODO ...
    }
IceUtil::CtrlCHandler ctrlCHandler;
    ctrlCHandler.setCallback(interruptedCallback);
10、工具集提供了一個內存緩存對象IceUtil::Cache,提供基於key-value的數據存儲
    template<typename Key, typename Value>
class Cache
{
public:
Handle<Value> getIfPinned(const Key&, bool = false) const;             // 查詢接口,不會調用Load進行失效加載
void unpin(Position);                                                  // 刪除接口
  void clear();                                                          // 刪除所有接口
size_t size() const;                                                   // 查詢記錄數
bool pin(const Key&, const Handle<Value>&);                            // 插入接口,不會調用Load進行失效記載
Handle<Value> pin(const Key&);                                         // 查詢接口,如果不存在則會調用Load進行失效加載
Handle<Value> putIfAbsent(const Key&, const Handle<Value>&);           // 更新接口,會做失效加載,並用新值替換,返回舊值


protected:
virtual Handle<Value> load(const Key&) = 0;                            // 失效加載接口
virtual void pinned(const Handle<Value>&, Position);                   // 在插入或者更新成功後會回調該接口
};
11、工具集還提供了一個用於臨時new對象管理的結構,可以用來臨時的保存new出來的指針,並在其對象聲明週期結束時delete掉指針,
    當然這也可以用智能指針來辦到,但是基礎的數據類型智能指針就無能爲力了,使用ScopedArray或許是一個不錯的選擇:
IceUtil::ScopedArray<Ice::Int> array;
Ice::Int* p = new Ice::Int[10];
array[5] = 100;
array.reset(p);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章