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的使用說明
#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);