ICE的工具集基本功能

原创 2012年03月24日 16:06:08
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);

Zeroc ICE 源码分析二 IceUtil

ICE提供了一个夸平台的c++ middleware,包含在源码的include/IceUtil中。IceUtil中包含的主要类如下图所示: 这些类主要提供了3类跨平台的基础功能: 1. Smart...

ICE笔记(08):C++线程与并发

【colorado】Ice 提供了一个简单的线程抽象层,用以编写可移植的多线程程序。通过同步原语可以实现不同粒度的并发控制。1、互斥体IceUtil::Mutex类和IceUtil::StaticMu...

ICE简单介绍及使用示例

1、ICE是什么?  ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,使我...

ICE的Timer和TimerTask

IceUtil中提供了Timer和TimerTask来实现定时计算。Timer可以定时或重复执行TimerTask。 class Timer : /* ... */ { public: Ti...
  • whuqin
  • whuqin
  • 2012年09月28日 14:59
  • 2305

详细教你如何部署ICE服务(一)

这系列文章将会一步步教你如何部署一个ICE服务,如果你正在读这篇博客,我想你已经了解了什么是ICE(Internet Communications Engine),以及如何去实现ICE服务,并且了解什...

很不多的ICE架构入门学习例子-ping程序

ICE架构基础demo学习

Ant工具使用之——基本功能介绍

Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能。在本文中,主要让读者熟悉怎样将Ant应用到Java项目中,让它简化构建和部署操作。 一.          ...

[Java工具集]Google Guava 常用功能

Google Guava简介 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ICE的工具集基本功能
举报原因:
原因补充:

(最多只允许输入30个字)