关闭

ICE的工具集基本功能

标签: 工具timerthreadstring任务class
5120人阅读 评论(0) 收藏 举报
分类:
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);
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:92007次
    • 积分:1204
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:3篇
    • 译文:0篇
    • 评论:23条
    文章分类
    最新评论