对象状态示例类

================================================================================
标题: 对象状态示例类
作者: 叶飞虎
日期: 2020.01.31


   基于对象状态类的示例类,可以根据示例类举一反三,充分提高多线程的并发能力。

对象状态示例类的头文件(DemoState.h)如下:

// =======================================
// Unit   : 对象状态示例类
// Version: 1.0.0.0 (build 2020.01.31)
// Author : Kyee Ye
// Email  : kyee_ye(at)126.com
// Copyright (C) Kyee workroom
// =======================================

#ifndef _DemoState_H_
#define _DemoState_H_

#include "KYLib.h"

namespace demo
{

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TDemoState - TKYObjState 使用示例类 */

class TDemoState
{
public:
   // 状态
   enum TState
   {
      dsInactive  = TKYObjState::osInactive, // 未启动
      dsStopping  = TKYObjState::osClosing,  // 正在停止
      dsStarting  = TKYObjState::osOpening,  // 正在启动
      dsStarted   = TKYObjState::osOpened,   // 已经启动
   };

private:
   // 注: TItem 为假设类项
   typedef TObject               TItem;
   typedef TKYMapIntKey<TItem>   TItems;

   // 内部信息
   typedef struct
   {
      DWord       ID;
      KYString    Name;
      KYString    Password;
   } TInfo;

private:
   // 不支持对象拷贝
   TDemoState(const TDemoState& obj) {}

public:
   // 构造/析构函数
   TDemoState();
   virtual ~TDemoState();

   // 属性
   DWord          ID() const           { return FInfo.ID; }
   KYString       Name() const         { return FInfo.Name; }
   TState         State() const        { return (TState)FObjState.State(); }
   // ??? ... ...

   // 设置属性
   void           SetID(DWord AID);
   void           SetName(const KYString& AName);
   void           SetPassword(const KYString& APassword);
   // ??? ... ...

   // 启动/停止
   bool           Start(DWord AID, const KYString& AName, const KYString& APassword);
   bool           Start()              { return FObjState.Open() == TKYObjState::orSuccess; }
   void           Stop(bool ANeedWait = false)
                  { FObjState.Close(ANeedWait); }

   // 示例方法
   int            OpenItem(const KYString& AFileName, unsigned AMode);
   void           CloseItem(int AItemID);

   // 其它方法
   void           XXX();

   // ??? ... ...

protected:
   // 加锁/解锁
   void           Lock()               { FObjState.Lock(); }
   void           Unlock()             { FObjState.Unlock(); }

   // 引用计数加/减 1
   bool           IncRefCount_Opening(){ return FObjState.IncRefCountGE(TKYObjState::osOpening); }
   bool           IncRefCount()        { return FObjState.IncRefCount(TKYObjState::osOpened); }
   void           DecRefCount()        { FObjState.DecRefCount(); }

   // ??? ... ...

private:
   // 执行初始化
   void           DoInit();

   // 执行启动/停止
   int            DoStart(TInfo* AInfo);
   void           DoStop();

   // 执行释放项的事件方法
   void           DoFreeItem(long AItemID, TItem* AItem);

   // 执行断开连接的事件方法
   // 注: 假设存在 OnDisconnect 事件
   void           DoDisconnect(void* Sender);

   // ??? ... ...

private:
   TInfo          FInfo;               // 信息项
   TItems*        FItems;              // 项列表
   TKYObjState    FObjState;           // 对象状态
   // ??? ... ...
};

}

#endif

对象状态示例类的代码文件(DemoState.cpp)如下:

// =======================================
// Unit   : 对象状态示例类
// Version: 1.0.0.0 (build 2020.01.31)
// Author : Kyee Ye
// Email  : kyee_ye(at)126.com
// Copyright (C) Kyee workroom
// =======================================

#include "DemoState.h"

namespace demo
{

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TDemoState - TKYObjState 使用示例类 */

// ---------------- 静态成员 ----------------

// ---------------- 静态函数 ----------------

// ---------------- 构造函数和析构函数 ----------------
// 构造函数
TDemoState::TDemoState()
{
   // 设置 FObjState 的回调方法
   FObjState.SetDoOpen(this, (TKYObjState::TDoRet)&TDemoState::DoStart,
                             (TKYObjState::TDoNone)&TDemoState::DoStop,
                             (TKYObjState::TDoNone)&TDemoState::DoInit);

   // 创建对象
   FItems   = new TItems(false, true, this, (TItems::TDoFree)&TDemoState::DoFreeItem);

   // ??? ... ...
}

// 析构函数
TDemoState::~TDemoState()
{
   // 停止, 注: 必须在其它对象释放前调用
   Stop(true);

   // 释放对象
   FreeAndNil(FItems);

   // ??? ... ...
}

// ---------------- 私有函数 ----------------
// 执行初始化
void TDemoState::DoInit()
{
   // 清除项列表
   FItems->Clear();

   // ??? ... ...
}

// 执行启动
int TDemoState::DoStart(TInfo* AInfo)
{
   // 初始化
   int result = TKYObjState::orFailure;

   // 判断是否通过参数传入
   if (AInfo != NULL)
      FInfo = *AInfo;

   // 调用启动
   printf(" >>>  start {ID: %u, name: \"%s\"}\n", FInfo.ID, (const char*)FInfo.Name);
   /*
   if (_XXX_Start(FInfo.ID, FInfo.Name, FInfo.Password))
      result = TKYObjState::orSuccess;
   */
   // ??? ... ...

   // 返回结果
   return result;
}

// 执行停止
void TDemoState::DoStop()
{
   printf(" <<<  stop {ID: %u}\n", FInfo.ID);
   /*
   _XXX_Stop(FInfo.ID);
   */
   // ??? ... ...
}

// 执行释放项的事件方法
void TDemoState::DoFreeItem(long AItemID, TItem* AItem)
{
   printf(" ~~~  free-item {item-ID: %d, item: %p}\n", AItemID, AItem);

   // 关闭项
   /*
   _XXX_CloseItem(AItemID);
   */

   // 释放项对象
   delete AItem;
}

// 执行断开连接的事件方法
// 注: 假设存在 OnDisconnect 事件
void TDemoState::DoDisconnect(void* Sender)
{
   FObjState.SetClosed();
}

// ---------------- 保护函数 ----------------

// ---------------- 公有函数 ----------------
// 设置 ID 属性
void TDemoState::SetID(DWord AID)
{
   Lock();
   if (State() == dsInactive)
      FInfo.ID = AID;
   Unlock();
}

// 设置 Name 属性
void TDemoState::SetName(const KYString& AName)
{
   Lock();
   if (State() == dsInactive)
      FInfo.Name = AName;
   Unlock();
}

// 设置 Password 属性
void TDemoState::SetPassword(const KYString& APassword)
{
   Lock();
   if (State() == dsInactive)
      FInfo.Password = APassword;
   Unlock();
}

// 启动
bool TDemoState::Start(DWord AID, const KYString& AName, const KYString& APassword)
{
   // 初始化
   TInfo recInfo;

   // 设置信息项
   recInfo.ID        = AID;
   recInfo.Name      = AName;
   recInfo.Password  = APassword;

   // 打开
   return FObjState.Open(&recInfo) == TKYObjState::orSuccess;
}

// 打开项
int TDemoState::OpenItem(const KYString& AFileName, unsigned AMode)
{
   // 初始化
   int      result = -1;
   KYString strFile = AFileName;

   // 检查参数
   if (strFile.Trim().Length() == 0)
      result = -2;
   else if (IncRefCount())    // 引用计数加 1
   {
      int intID = 0;
      /*
      intID = _XXX_OpenItem(AFileName, AMode);
      */
      if (intID > 0)
      {
         // 初始化
         TItem* objItem = NULL;

         // 创建项对象
         /*
         try
         {
            objItem = new TItem(intID);
            // ??? ... ...
         }
         catch (...) {}
         */

         // 添加列表
         if (objItem != NULL && FItems->Add(intID, objItem) != NULL)
            result = intID;
         else
         {
            // 关闭项
            /*
            _XXX_CloseItem(intID);
            */

            // 释放项
            if (objItem != NULL)
               delete objItem;
         }
      }
      else if (intID == 0)
         result = 0;

      // 引用计数减 1
      DecRefCount();
   }

   // 返回结果
   return result;
}

// 关闭项
void TDemoState::CloseItem(int AItemID)
{
   // 检查参数并引用计数加 1
   if (AItemID > 0 && IncRefCount())
   {
      // 删除项
      FItems->Delete(AItemID);

      // 引用计数减 1
      DecRefCount();
   }
}

// 其它方法
void TDemoState::XXX()
{
   // 引用计数加 1
   if (IncRefCount())
   {
      // 操作
      // ??? ... ...

      // 引用计数减 1
      DecRefCount();
   }
}

}

对象状态及示例代码(ObjState.rar)下载如下:
https://pan.baidu.com/s/1eTWTYD0#list/path=%2Fshares%2Fsources%2F_open

================================================================================
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值